1

パッケージを取得してC++でコンソールに出力できるプログラムを作成しています。次のように char 配列を 1024 に設定します。

char* buffer = new char[1024];

メッセージが正確に 1024 文字ではない場合、配列に空のスペースがあるため、メッセージの最後に不明な文字がたくさんあります。私に何ができる?

詳細情報(役に立つかどうかわかりません)

ソケットは Java プログラムによって送信されます

Socket socket = new Socket("127.0.0.1", 27555);

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("I am your client :D");
out.flush(); 

サーバーは C++ コンソール アプリケーションによって作成されます。

char* recvData = new char[1024];
recv(socket, recvData, strlen(recvData), 0);
cout << recvData << endl;
4

4 に答える 4

5

strlennull ( '\0') 文字が検出されるまでのバイト数をカウントします。単一のrecv呼び出しによって返されるデータが nul で終了するという保証はないため、返されるバイト数を確認してから、独自のターミネータを追加する必要があります。

char* recvData = new char[1024];
int bytes = recv(socket, recvData, 1023, 0);
if (bytes == -1) {
    cout << "error on recv" << endl;
}
else {
    recvData[bytes] = '\0';    
    cout << recvData << endl;
}
于 2013-05-29T10:03:41.357 に答える
1

recvDatanull で終了していないため、この場合の結果strlen()は未定義です。次のようなことをする必要があります。

int len = 1024;
char *recvData = new char[len + 1];
int lenRead = recv(socket, recvData, len, 0);
if (lenRead < len)
    recvData[lenRead] = '\0';
else
    recvData[len] = '\0'; 
cout << recvData << endl;
于 2013-05-29T10:09:47.530 に答える
0

これは明白ではありませんか?:)

最初に文字列の長さを送信するか、文字列を「適切に」終了するだけです(\0文字列の末尾に a を送信します。これはJavaがここで行っていないことだと思います)。

ただし、全体として、バッファに書き込む前に十分な空き領域があることを確認したい場合があるため、とにかく「パケット長」を含める必要があります (strlen()初期化されていない配列で使用することは通常、悪い考えです)。

于 2013-05-29T10:04:31.653 に答える