套接字的拓展及总结

发布时间 2023-11-03 00:30:11作者: yuan_f

套接字编程

编程实现效果

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);
}