服务器程序陷入接受功能

时间:2015-06-09 13:47:21

标签: c multithreading server

我正在使用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函数上。我怎样才能解决这个问题,以便在其他线程运行时我可以在主线程中做其他工作?

2 个答案:

答案 0 :(得分:3)

正如我在评论中提到的,除非您指定套接字为非阻塞,否则accept是一个阻塞调用。

您可以通过以下方式实现此目的:

fcntl(sock_desc, F_SETFL, fcntl(sock_desc, F_GETFL, 0) | O_NONBLOCK);` 

您可以使用fcntl

的返回值进行错误检查

答案 1 :(得分:0)

有两种方法可以达到你想要的效果。

  1. 您可以将套接字设置为非阻塞。在这种情况下,accept将立即返回。
  2. 您可以使用select(或poll)等待套接字准备接受或发生超时。如果你把它放到你的主循环中,你可以在select之后检查它是否因为传入的连接正在等待而返回(并且accept它)或者是否发生了超时(并且你做了其他的事情)。 / LI>