胡家伙,
我很久以前就遇到了这个问题,请帮忙!我在一台笔记本电脑上有服务器,它正在另一台笔记本电脑上发送数据到同一个局域网我可以在服务器端和客户端上的wireshark上看到udp数据包......但问题出在代码中,客户端只是卡在线上“printf(”打开数据报套接字...... OK。\ n“); “为什么代码不能正常工作printf从服务器收到buf?正如我所说,数据包在wireshark中可见让我困惑的是:S
请提出任何建议......
int main(){
struct sockaddr_in srv_addr;
int sd,fd,datalen,numRead;
ssize_t nbytes,numWrite;
socklen_t addrlen=sizeof(struct sockaddr_in);
char buf[MAX_SIZE],tmp[MAX_SIZE];
if((sd = socket(AF_INET, SOCK_DGRAM, 0))<0){
printf("Opening datagram socket error",strerror(errno));
return 1;
}else{
printf("Opening datagram socket....OK.\n");
}
memset((char *) &srv_addr, 0, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(PORT_NUM);
srv_addr.sin_addr.s_addr = inet_addr(IP_SERVER);
memset(buf,0,MAX_SIZE);
while(1){
nbytes = recvfrom(sd,buf,MAX_SIZE,0,(struct sockaddr *)&srv_addr, &addrlen);
if(nbytes != -1){
printf("The %s message from server\n",buf);
}else{
printf("Recvfrom error %s\n",strerror(errno));
}
return 0;
}
答案 0 :(得分:2)
您错过了bind()
来电。
bind(sd, (SOCKADDR*) &srv_addr, sizeof (srv_addr));
两端总是需要 bind,否则你的socket不会知道它正在运行什么端口/接口。
此外,您必须将Socket绑定到本地计算机上的接口。 srv_addr.sin_addr.s_addr = inet_addr(IP_SERVER);
定义了由其IP标识的接口,Socket绑定并监听。如果要限制通信伙伴,则必须检查recvfrom返回的sockaddr结构(第5个参数)
将inet_addr(IP_SERVER)
替换为htonl(INADDR_ANY)
。这将告诉您的套接字监听本地计算机上可用的每个接口。