0

我在 c++(服务器)和 php(客户端)中的套接字有一些问题。下面是代码。问题是,每当客户端断开连接(由于失败或其他原因)时,pClient->send() 函数应该返回 -1 或 0。但是,它没有。因此我无法打破循环,并且程序在此功能上失败。我究竟做错了什么?我希望你能帮帮我!

int sentSucces=0;
char szData[MAX_PACKET];
memset(szData, 0, MAX_PACKET);

CPassiveSocket socket;
CActiveSocket *pClient = NULL;
sendInterval = 10;
socket.Initialize();
socket.Listen((const uint8 *) "127.0.0.1", 9876);
socket.SetNonblocking(); //if no connection in queue, don't wait (accept())

while (1) {
    //check queue for connections.
    if ((pClient = socket.Accept()) != NULL) {
        pClient->SetNonblocking();
        cout << "++ connected\n";
        while (1) {
            // Receive request from the client.
            cout << "- receiving....\n";
            if (pClient->Receive(MAX_PACKET) > 0) {
                cout << "-- received\n";
                strncpy(szData, (const char *) pClient->GetData(), pClient->GetBytesReceived());
                cout << "-- +: " << szData << "\n";
                //clear memory of szData
                memset(szData, 0, MAX_PACKET);

            } else {
                cout << "-- NOT received\n";
            }

            string bericht = "hallo";
            cout << "sending....\n";
            sentSucces = pClient->Send((const uint8 *) bericht.c_str(), strlen(bericht.c_str()));
            cout << "++ send:" << sentSucces << "\n";
            if (sentSucces < 1) break;
            sleep(4);
        }
        cout << "++ disconnecting...\n";
        pClient->Close();
        cout << "++ disconnected\n";
    } else {
        //  cout << "++ no connections\n";
    }
    usleep(10000);
}
4

1 回答 1

1

您的代码在Receive. 如果您不想这样做,请不要这样做。该Send函数不会返回错误的原因是因为您永远无法到达它,永远在Receive.

无论您正在实施什么协议,它的规范是否说连接的这一端应该永远等待尝试接收数据?如果是这样,它就坏了。如果没有,那么您的代码已损坏。如果您没有协议规范,则需要编写一个。否则,您的所有代码只能靠运气一起工作。

TCP 协议确实保证发送方最终会检测到断开连接。但是对于永远等待接收数据的一方来说,这并不能保证。如果对方根本没有发送任何东西并离开了,你仍然会永远等待。当您设计一个通过 TCP 工作的协议时,您必须在协议设计中考虑到这一点。甚至在编写一行代码之前就应该解决这个问题。

于 2012-10-11T08:04:37.993 回答