套接字编程
编程实现效果
server:
client:
问题及解决方法
问题:出现死循环
猜想:在判断是否接收到客户端请求,即阻塞时,输出的判断信息perror("recvfrom failed\n");
误被recvfrom识别成缓冲区输入
if(recvfrom(serfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&addrlen)<0){
perror("recvfrom failed\n");
}
解决:不对客户端还未有请求做识别,而对当客户端请求时才做输出
if(recvfrom((long)arg,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&addrlen)>0){
//perror("recvfrom failed\n");
//}
printf("recvfrom success\n");
printf("IP=%s,port=%u\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
printf("receive: %s\n",buf);
}
但实际并没有解决问题,死循环的根源在于:(1)recvfrom函数输出总是出错,即返回-1;(2)输出的判断信息perror("recvfrom failed\n");
误被recvfrom识别成缓冲区输入。——致使recvfrom函数无法实现阻塞功能,从而形成死循环
最终改正:对参数引用时的类型转换出错,需要对传入参数进行正确的类型转换,即*(int *)arg
if(recvfrom(*(int *)arg,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&addrlen)>=0){
//perror("recvfrom failed\n");
//return -1;
//}
printf("recvfrom success\n");
printf("IP=%s,port=%u\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
printf("receive: %s\n",buf);
}