如何在多个线程中使用accept()一次监听多个套接字?

时间:2014-02-20 19:57:59

标签: c multithreading sockets

Visual Studio 2010中的Visual C / C ++

我正在使用由其他人创建的COM服务,该服务创建运行相同例程的多个线程。在每个线程中,在套接字上调用accept()。除端口号外,套接字相同。

问题是当一个线程调用accept()时,另一个线程被阻塞。我在这个网站上读过一些关于内核空间与用户空间中的线程的其他帖子,但由于我正在实现其他人的COM接口,所以我无法控制它。

  1. 跨线程阻塞是否因为我在用户空间工作而发生?我怎么说?我无权访问运行第三方COM服务器应用程序的代码。
  2. 如果我想同时收听多个套接字,如何调整当前情况?
  3. 其他说明: 我尝试使用相同的端口但是bind()在一个线程中成功而在另一个线程中失败。从MSDN文档中,我知道默认情况下accept()是一个阻塞函数,但我可以选择使其成为非阻塞函数。我还没有尝试过非阻塞。

    这是我的代码的要点。我修剪了错误捕捉。

    iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
    
    hints.ai_family     = AF_INET;
    hints.ai_socktype   = SOCK_STREAM;
    hints.ai_protocol   = IPPROTO_TCP;
    hints.ai_flags      = AI_PASSIVE;
    
    // Resolve the local address and port to be used by the server
    iRet = getaddrinfo(NULL, iniListenPort, &hints, &result);
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
    // Bind socket to local address
    iRet = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); // blocking
    
    freeaddrinfo(result); // free memory allocated by getaddrinfo()
    
    // Setup the TCP listening socket
    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
    

    重复调用:

    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL); // blocking
    
    // We are receiving data
    do {
        recvRet = recv(ClientSocket, recvbuf, recvbuflen, 0); // recv() ~ blocks and waits for data to arrive 
        } while (recvRet > 0)
    

0 个答案:

没有答案