【问题标题】:Server program gets stuck at accept function服务器程序卡在接受功能
【发布时间】:2015-08-24 09:10:20
【问题描述】:

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

【问题讨论】:

  • 您是否将套接字设置为非阻塞?
  • 不是因为while阻塞了socket吗?
  • @Alejandro 如何将套接字设置为非阻塞?
  • @Simer fcntl(sock_desc, F_SETFL, fcntl(sock_desc, F_GETFL, 0) | O_NONBLOCK); 尝试一下,让我们知道行为
  • 你不能在另一个线程中进行接受调用吗?

标签: c multithreading server


【解决方案1】:

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

您可以通过以下方式实现:

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

您可以使用来自fcntl 的返回值进行错误检查

【讨论】:

【解决方案2】:

有两种方法可以实现你想要的。

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

【讨论】:

    猜你喜欢
    • 2022-09-13
    • 1970-01-01
    • 2023-04-07
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多