我在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);
}
答案 0 :(得分:1)
您的代码会在Receive
中永远等待。如果您不想这样做,请不要这样做。 Send
函数不会返回错误的原因是因为你永远无法在Receive
中等待它。
无论您正在实施什么协议,它的规范是否说连接的这一端应该永远等待尝试接收数据?如果是这样,那就破了。如果没有,那么您的代码就会被破坏。如果您没有协议规范,则需要编写一个。否则,您的所有代码只能通过运气一起工作。
TCP协议确保发送方将最终检测到断开连接。但是对于一个等待永远接收数据的一方而言,它没有得到保证。如果对方根本不发送任何东西而消失,你仍将永远等待。设计通过TCP工作的协议时,必须在协议设计中考虑这一点。在编写一行代码之前,这应该已经解决了。