中易网

socket中有哪些是阻塞函数?

答案:2  悬赏:70  
解决时间 2021-04-08 11:27
socket中有哪些是阻塞函数?
最佳答案
recv
send
accept
全部回答
最近项目遇到一个问题,程序退出的时候资源没有正常释放。经过调试发现,原来是网络线程一直阻塞,导致一些必要的资源没有被释放,写了几个简单的测试程序调试了一下才明白,原来在linux下直接close socket的文件描述符,并不会使程序中调用的一些阻塞式的socket函数(比如 read、recvfrom 等)退出阻塞,从而导致无法正常释放资源。简化示例如下。 下面是一个简化的udp服务程序,首先创建socket对象,然后开启服务线程,将客户端发送过来的数据包回发给客户端。当用户在shell中敲入两次回车后,程序退出。#include #include #include #include #include #include #define server_port 8888 #define buffer_len 256 int g_exit = 0; void *service( void* arg ) { char buff[buffer_len]; struct sockaddr clientaddr; int socklen = sizeof(clientaddr); int recvbytes; int socketfd = *((int *)arg); printf("ok, enter service!\n"); while(!g_exit) { recvbytes = recvfrom(socketfd,buff,buffer_len,0,&clientaddr,&socklen); sendto(socketfd,buff,recvbytes,0,&clientaddr,socklen); } printf("ok, service thread exit!\n"); pthread_exit(null);; } int main(...最近项目遇到一个问题,程序退出的时候资源没有正常释放。经过调试发现,原来是网络线程一直阻塞,导致一些必要的资源没有被释放,写了几个简单的测试程序调试了一下才明白,原来在linux下直接close socket的文件描述符,并不会使程序中调用的一些阻塞式的socket函数(比如 read、recvfrom 等)退出阻塞,从而导致无法正常释放资源。简化示例如下。 下面是一个简化的udp服务程序,首先创建socket对象,然后开启服务线程,将客户端发送过来的数据包回发给客户端。当用户在shell中敲入两次回车后,程序退出。#include #include #include #include #include #include #define server_port 8888 #define buffer_len 256 int g_exit = 0; void *service( void* arg ) { char buff[buffer_len]; struct sockaddr clientaddr; int socklen = sizeof(clientaddr); int recvbytes; int socketfd = *((int *)arg); printf("ok, enter service!\n"); while(!g_exit) { recvbytes = recvfrom(socketfd,buff,buffer_len,0,&clientaddr,&socklen); sendto(socketfd,buff,recvbytes,0,&clientaddr,socklen); } printf("ok, service thread exit!\n"); pthread_exit(null);; } int main( int argc,char * argv[] ) { int fd; void *status; struct sockaddr_in serveraddr; pthread_t thr; pthread_attr_t attr; fd = socket(af_inet,sock_dgram,0); memset(&serveraddr,0,sizeof(serveraddr)); serveraddr.sin_family = af_inet; serveraddr.sin_addr.s_addr = htonl(inaddr_any); serveraddr.sin_port = htons(server_port); bind(fd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); // create service thread pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, pthread_create_joinable); if( pthread_create(&thr,&attr,service,(void *)&fd ) ) { printf("pthread_create fail!\n"); return -1; } // free attribute pthread_attr_destroy(&attr); // wait user control exit getchar(); getchar(); g_exit = 1; printf("ok, waiting for thread exit...!\n"); close(fd); // wait for thread exit pthread_join(thr, &status);printf("ok, exit main process !\n"); return 0; } 上述程序,当用户敲两次回车后,显示结果如下: 可以看到,没有打出主进程和服务线程的退出信息,无论是主进程还是服务线程都没有正常退出,由此可见,直接close socket句柄,并不能使 recvfrom 函数退出阻塞。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
求徐启航的英文名
跟男朋友的妈妈在一起的时候,不知道说些什么
如果自己的声卡时2.1声道的,耳机是5.1声道的
如何去除word中的脚注
化学问题:酯化反应时,加热有什么作用?(两个)
青岛兴程人力资源公司天津分公司地址在什么地
道莲·格雷的画像中亨利勋爵到底是不是一个反
fxdd外汇翻译成中文叫什么?
宝马320自动变速箱油用几升?
本人做建筑5年了,想换工作,不知道做什么好,没
一个人的签名是向幸福出发是什么意思
天越加密狗
我在昆山交社保几年,现来张家港工作以后两地
这款车子是什么型号的,大概多少钱。
隋朝越国公靠山王谁大?
推荐资讯
作文写总有个地方让我铭记在心
提供几个最有激情,让人听了有上进心的歌,最好
滕州邦赢网络科技有限公司地址在什么地方?
霸唱的小说(凶宅猛鬼)写完了吗?
把醋放在暖气上有一星期了,会不会坏了?
贴片三极管8A J2是什么管子啊
求求给给好看的末世男变女小说(谢谢啦)
请问初学萨克斯,最好是什么调的? 现在价位多
红豆黑豆黄豆茨实雪耳木耳可以放一起煲吗
事业编制和公务员编制有什么不同 事业编制的
作为一名OTC销售代表进药房推荐药品时店长闲
OPPOA53防不防水
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?