socket 编程遇到的问题 求高手指点
服务器端代码:
#include "socket_connect.h"
struct sockaddr_in server,sink_addr;
void socket_connect_init(int *sockfd,unsigned short port)
{
int sock;
int structlength;
memset((char *)&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(port);
bzero(&sink_addr, sizeof(sink_addr));
sink_addr.sin_family = AF_INET;
sink_addr.sin_port = htons(port);
sink_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if((sock = socket (AF_INET,SOCK_DGRAM,0)) < 0 ){
printf("socket create error!\n");
exit(1);
}
structlength = sizeof(server);
if( bind(sock,(struct sockaddr *) &server,structlength) < 0){
printf("socket bind error!\n");
perror("bind");
exit(1);
}
*sockfd = sock;
}
void socket_connect_recv(int sock,struct sockaddr_in *client,char *msg,int len)
{
memset(client,0,sizeof(struct sockaddr_in));
int structlength = sizeof(struct sockaddr_in);
int recvd = recvfrom(sock,msg,len,0,(struct sockaddr *) client,&structlength);
if(recvd < 0){
perror("recvfrom");
exit(EXIT_FAILURE);
}
else{
msg[recvd] = '\0';
}
}
void socket_connect_send(int sock,char *buff,int size){
//int structlength = sizeof(struct sockaddr_in);
//int snd = sendto(sock,msg,len,0,(struct sockaddr *) client,structlength);
int snd = sendto(sock, buff, size, 0, (struct sockaddr *)&sink_addr, sizeof(struct sockaddr));
if(snd < 0){
perror("sendto");
exit(1);
}
}
void socket_connect_close(int sockfd){
close(sockfd);
}
服务器端主函数:
#include <stdio.h>
#include "socket_connect.h"
int main(){
int sock;
struct sockaddr_in client;
char msg[20]="11111111";
socket_connect_init(&sock,8000);
while(1)
{
//socket_connect_recv(sock,&client,msg,sizeof(msg));
printf("The send msg is %s\n",msg);
socket_connect_send(sock,msg,sizeof(msg));
}
socket_connect_close(sock);
}
客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string.h>
#define PORT 8000 /* Server的端口 */
#define MAXDATASIZE 100 /*一次可以读的最大字节数 */
int main(int argc, char *argv[])
{
int sockfd, numbytes, sin_size;
char buf[MAXDATASIZE] = "Hello, world!";
struct sockaddr_in their_addr; /* 对方地址信息 */
if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT);
their_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(their_addr.sin_zero), 8);
char i = 1;
while(i<10)
{
//numbytes = sendto(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&their_addr,sizeof(their_addr));
//if (numbytes == -1)
//{
//perror("sendto");
//exit(1);
//}
//printf("Send: %s\n",buf);
numbytes = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);
if (numbytes == -1)
{
perror("recvfrom");
exit(1);
}
buf[numbytes] = '\0';
printf("Received:%s\n",buf);
i++;
}
close(sockfd);
return 0;
}
程序运行的时候,我先运行服务器端的代码,然后再运行客户端的代码,但是客户端始终接受不到服务器端发过来的信息!不知道问题出现自那里,请高手给予指点!
[解决办法]
我肿么没看到服务器开"监听"的函数啊?
[解决办法]
[解决办法]
客户端没有bind,客户端每次发数据都用不同的端口(打一枪换一个地方)
当然收不到服务器端给的回应了。
[解决办法]
[解决办法]
。。。
楼主弄反了,服务端主送发包了。。。
客户端反而没有bind。。。
[解决办法]
common.h
- C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pthread.h>#include <fcntl.h>#include <errno.h>#include <signal.h>#include <linux/types.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <ctype.h>static int init_listener(int *sd, int port){ struct sockaddr_in thisaddr; *sd = socket(AF_INET, SOCK_DGRAM, 0); memset(&thisaddr, 0, sizeof(thisaddr)); thisaddr.sin_family = AF_INET; thisaddr.sin_addr.s_addr = htonl(INADDR_ANY); thisaddr.sin_port = htons(port); if(bind(*sd, (struct sockaddr *)&thisaddr, sizeof(thisaddr)) == -1) { perror("bind error"); return -1; } return 0;}