gpt4 book ai didi

php - 客户端断开连接后 CSimpleSocket 失败

转载 作者:行者123 更新时间:2023-11-28 07:55:20 25 4
gpt4 key购买 nike

我在使用 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);
}

最佳答案

您的代码在Receive 中永远等待。如果你不想那样做,那就别做。 Send 函数不会返回错误的原因是因为您永远不会到达它,永远在 Receive 中等待。

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

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

关于php - 客户端断开连接后 CSimpleSocket 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12834845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com