我正在使用Pthreads(Linux)在C语言中处理服务器应用程序。一切正常,客户端可以连接服务器并传输数据。面临的问题是我的软件一直处于接受状态,直到它没有收到客户的新请求为止。
这是我的代码:
while((connfd = accept(sock_desc, (struct sockaddr *)&echoClntAddr (socklen_t*)&clntSock)))
{
puts("Connection accepted");
if( pthread_create( &thr, NULL , connection_handler , (void*) &connfd) < 0)
{
perror("could not create thread");
return 1;
}
puts("Handler assigned");
}
我可以运行多个线程但我的主线程卡在accept
函数上。我怎样才能解决这个问题,以便在其他线程运行时我可以在主线程中做其他工作?
答案 0 :(得分:3)
正如我在评论中提到的,除非您指定套接字为非阻塞,否则accept
是一个阻塞调用。
您可以通过以下方式实现此目的:
fcntl(sock_desc, F_SETFL, fcntl(sock_desc, F_GETFL, 0) | O_NONBLOCK);`
您可以使用fcntl
答案 1 :(得分:0)
有两种方法可以达到你想要的效果。
accept
将立即返回。select
(或poll
)等待套接字准备接受或发生超时。如果你把它放到你的主循环中,你可以在select
之后检查它是否因为传入的连接正在等待而返回(并且accept
它)或者是否发生了超时(并且你做了其他的事情)。 / LI>
醇>