我有下面的代码,我不知道为什么它不能正常工作。
它是一个多线程TCP服务器,循环accept()调用并触发指定的
每次都穿线。
问题是接受有时不会阻塞,从而导致
理论上没有连接时打开新线程的程序。
这就是循环-

    for (dwI = 0;; dwI++)                       //Accept MAX_CLIENTS connections
{
    if(MAX_CLIENTS == dwI)
    {
        dwI=0;
        continue;
    }//if

    if(clients[dwI].bIsInUse)
    {
        continue;
    }//if

    ZeroMemory(&from,sizeof(from));

    if(!AcceptConnection(&ServerSock,&from,&ClientSock))
    {
        PRINT_LE("AcceptConnection",ERROR_ACCEPT_SERVER_CONNECTION);
        closesocket(ServerSock);
        WSACleanup();
        return EXIT_FAILURE;
    }//if

    clients[dwI].ClientSock = ClientSock;

    if(! (clients[dwI].hThread = CreateThread(
            NULL,               //Not inheritable
            0,                  //Default stack size
            ThreadedAcceptTCP,       //ThreadedAccept - function
            &clients[dwI],//Pass pointer to the socket
            0,                  //Start immidiately
            &clients[dwI].dwThreadId                //Save thread id
            )))
    {
        PRINT_GLE("CreateThread");
        closesocket(ServerSock);
        WSACleanup();
        return EXIT_FAILURE;
    }//if

    #ifdef PRINT_STATUS                     //Print status if macro is defined
        printf("Server responce message has been sent.\n");
    #endif
}//for

每个函数都有我自己的包装。
AcceptConnection具有以下代码-
    SOCKET ClientSocket = INVALID_SOCKET;       //Client socket
INT sockaddrSize = sizeof(*pSockAddr);

ClientSocket = accept(          //Create client accepting socket
                *pSock,         //Listen-ed socket
                pSockAddr,
                &sockaddrSize
                );

if (INVALID_SOCKET == ClientSocket)     //Check for errors - if any - cleanup and return failure
{
    PRINT_WSAGLE("socket");
    return FAILURE;
}//if

*pClientSock = ClientSocket;        //Pass socket

return SUCCESS;

当我通过浏览器连接到服务器时出现问题,
例如,
在第一个线程完成后(我通过暂时休眠主线程5秒来确保这一点)
它会清理所有东西并关闭客户端套接字,
尽管在第二次接受呼叫时-它将以相同的方式返回
SOCKADDR信息并导致一个额外的线程上升,
接收完全相同的数据,发送完全相同的数据。
打印2次(有时甚至更多次):
“服务器响应消息已发送。”
我不明白为什么会这样,希望你们能帮我。
谢谢!

最佳答案

这有点猜测,但我想知道这行代码的逻辑:

if(!AcceptConnection(&ServerSock,&from,&ClientSock))

它期望AcceptConnection在成功时返回非零值,在失败时返回零值。但是,函数成功时返回一个常量SUCCESS。但是,一些Windows头文件将常量SUCCESS定义为0。各种失效常数都是一些非零值。
即使您在自己的代码中定义成功和失败,也可能需要特别检查返回值,例如:
if (FAILURE == AcceptConnection(&ServerSock,&from,&ClientSock))

关于c - 接受调用不会第二次(或多次)阻塞吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14047733/

10-14 06:38