如何唤醒socket被阻塞的函数
作者:网络转载 发布时间:[ 2013/2/18 10:27:45 ] 推荐标签:
近项目遇到一个问题,程序退出的时候资源没有正常释放。经过调试发现,原来是网络线程一直阻塞,导致一些必要的资源没有被释放,写了几个简单的测试程序调试了一下才明白,原来在Linux下直接close socket的文件描述符,并不会使程序中调用的一些阻塞式的socket函数(比如 read、recvfrom 等)退出阻塞,从而导致无法正常释放资源。简化示例如下。
下面是一个简化的UDP服务程序,首先创建socket对象,然后开启服务线程,将客户端发送过来的数据包回发给客户端。当用户在shell中敲入两次回车后,程序退出。我们来观察一下程序退出后,socket服务线程在怎样的情况下可以正常退出。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>
#include <pthread.h>
#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!
");
while(!g_Exit)
{
recvbytes = recvfrom(socketfd,buff,BUFFER_LEN,0,&clientAddr,&socklen);
sendto(socketfd,buff,recvbytes,0,&clientAddr,socklen);
}
printf("OK, Service Thread Exit!
");
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!
");
return -1;
}
// Free attribute
pthread_attr_destroy(&attr);
// wait user control exit
getchar();
getchar();
g_Exit = 1;
printf("OK, Waiting For Thread Exit...!
");
close(fd);
// wait for thread exit
pthread_join(thr, &status);
printf("OK, Exit Main Process !
");
return 0;
}
上述程序,当用户敲两次回车后,显示结果如下:
可以看到,没有打出主进程和服务线程的退出信息,无论是主进程还是服务线程都没有正常退出,由此可见,直接close socket句柄,并不能使 recvfrom 函数退出阻塞。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11