1

私はwinapiでソケットを使用するのは初めてですが、このコードがあり、ソケットからのすべてのデータを印刷しようとしていますが、印刷しようとすると、シンボルがごちゃ混ぜになったものとして出てきます。これを行う方法の例を探しましたが、バッファからデータを収集した後にデータを出力する方法を示す例はありません。

do 
{
#define DEFAULT_BUFLEN 512
int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN];
recv(ConnectSocket, recvbuf, recvbuflen, 0);
printf("%.*s", recvbuflen, recvbuf);
} 
while (iResult > 0);

わかりました、コードをこれに変更しました

do 
{
#define DEFAULT_BUFLEN 1000000
int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN];
ssize_t len = recv(ConnectSocket, recvbuf, recvbuflen, 0);
recv(ConnectSocket, recvbuf, recvbuflen, 0);
printf("%.*s", recvbuflen, recvbuf);
} 
while (iResult > 0);

しかし、今ではソケットの最初の部分だけからすべての情報を出力していないようです

4

2 に答える 2

2

Valeri や他の人が述べているように、 の戻り値を無視すべきではありませんrecv。ただし、デフォルトではすべてのソケットがブロックされており、非ブロック ソケットを使用しているという言及はありません。したがって、接続が切断されない限り、recvバッファがいっぱいになるまで待機してから戻ります。それがあなたの問題を引き起こしているとは思いません。

ネットワーク経由でランダム データを送信している場合、得られる結果はまさに期待どおりのものです。拡張 ASCIIと呼ばれる 127 を超える文字値は、奇妙なシンボルとして表示される可能性があります。制御文字とも呼ばれる 32 未満の文字値は、ビープ音または文字消去の原因となる場合があります。

于 2013-04-21T14:16:46.920 に答える
1

受け取ったものの長さを無視しています:

ssize_t len = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if (len > 0)
{
    printf("%.*s", (int)len, recvbuffer);
}
else
{
    break; // error or EOF
}
于 2013-04-21T13:43:19.757 に答える