0

クライアント/サーバー アプリケーションがあります。クライアントはサーバーに質問を送信し、回答を受け取ります。

これはうまく機能しますが、同じソケットを使用して別の質問を送信しようとすると (ソケットを閉じずに - 回答を受信した後)、サーバーは 2 番目の質問を取得しません。

回答を送受信するためのコードは次のとおりです (これは何らかのループで機能するはずです)。

char* buf = "GET /count.htm HTTP/1.1\r\nHost: 127.0.0.1:666\r\nAccept: text/html,application/xhtml+xml\r\nAccept-Language: en-us\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/5.0\r\n\r\n";

int nBytesToSend= strlen(buf);
int iPos=0;

while(nBytesToSend)
{
    int nSent=send(hClientSocket,buf,nBytesToSend,0);
    assert(nSent!=SOCKET_ERROR);

    nBytesToSend-=nSent;
    iPos+=nSent;
}

//prepare buffer for incoming data
char serverBuff[256];
int nLeft=sizeof(serverBuff);
iPos=0;

do //loop till there are no more data
{
    int nNumBytes=recv(hClientSocket,serverBuff+iPos,nLeft,0);

    //check if cleint closed connection
    if(!nNumBytes)
        break;

    assert(nNumBytes!=SOCKET_ERROR);

    //update free space and pointer to next byte
    nLeft-=nNumBytes;
    iPos+=nNumBytes;

}while(1);
4

1 に答える 1

0

このコードでは、応答を読み取るループから抜け出すことができないため、2 番目の質問を送信することは不可能です (オフセットがバッファーをオーバーフローしたためにセグメンテーション違反が発生した場合、またはピアが接続を閉じた場合を除く)。 、この場合、あなたは送信できず、彼も受信できません)。

また、エラーがないと断言するだけでは決して十分ではありません。エラーが発生した場合は、何があったかを確認し、それに応じて対応する必要があります。少なくとも、印刷する必要があります。

于 2012-06-24T01:10:17.550 に答える