0

以下に、サーバーコードとクライアントコードのコードセグメントを示します。クライアントは正常に受信された整数をサーバーに送信し、次に長さstr_lenの文字列をサーバーに送信します。サーバーでの2番目の読み取りは機能していません。ブロックされており、何も読み取っていません。クライアントを終了すると、サーバーは何も読み取っていないと出力します。なにが問題ですか?

            //Server code

            bzero(buffer,256);
            n = read(newsockfd,buffer,255);
            if (n < 0) error("ERROR reading from socket");
            unsigned int *length = new unsigned int;
            memcpy(length, buffer, sizeof(int));
            cout << "Length : " << *length << endl;
            int len = *length + 1;
            char buffIn[len+1];
            bzero(buffIn,len);
            //ok msg?
            n = read(newsockfd,buffIn,len);
            if (n < 0) error("ERROR reading from socket");
            cout << "value of n" << n << endl;
            printf("Received : %s\n", buffIn);


            //client method

            void send(string req)
            {
                //Send string len
                unsigned int str_len = req.length();
                //str_len = 3000;
                write(socketFd, &str_len, sizeof(str_len));
                //Send string
                const char *str_req = req.c_str();
                printf("%s\n",str_req);
                cout << "Str len is : " << strlen(str_req) << endl;
                write(socketFd, str_req, strlen(str_req) + 1);
                cout << "write done " << endl;
            }
4

2 に答える 2

5

次の行を検討してください。

n = read(newsockfd,buffer,255);

その後、の正確な値を確認することはありませんn。関数が失敗したかどうかを確認しますが、読み取られたバイト数は確認しません。ヒント:あなたの場合、それは以上ですsizeof (int)

代わりにこれを試してください:

n = read(newsockfd, buffer, sizeof(int));

Nb:他の状況では、それよりも小さい可能性もありますsizeof(int)。その状態にも対処する必要があります。

于 2013-02-24T00:15:15.140 に答える
0

ソケットから255バイトの読み取りでstrの長さを読み取り、データの最初の251(32ビット整数を想定)をプルします。したがって、文字列の残りの部分を要求すると、送信されない追加の251バイトが要求され、読み取り呼び出しがブロックされます。

長さを整数に読みます

unsigned int length;
n=read(newsockfd,&length, sizeof(length));

現在のコードスニペットでは、長さを削除していません

unsigned int *length = new unsigned int;

これにより、小さなメモリリークが発生します。

Robが回答で述べているように、返されたエラーをチェックするだけでなく、返されたバイト数をチェックする必要があります。

于 2013-02-24T00:20:33.490 に答える