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 上で動作するプロトコルを設計する場合、プロトコル設計でこれを考慮する必要があります。これは、コードが 1 行も書かれる前に解決されているはずです。

于 2012-10-11T08:04:37.993 に答える