TCPソケットからデータを取得するために私が使用する読み取り機能が返ってくると誰かが説明してくれますか?TCPソケットのread()はいつ返します
以下のコードを測定システムから読み取るために使用します。このシステムは、15Hzの周波数のデータを配信します。 READ_TIMEOUT_MS
の値は200
です。さらにREAD_BUFFER_SIZE
の値は40000
です。 すべて正常に動作しますが、何が起こるかはread()
が1秒間に15回戻り、1349
バイトが読み込まれます。
http://www.ibm.com/developerworks/library/l-sockpit/
のInit:バッファが完全に満たされていることを、私が期待していた以下の文書に落とし穴5を読み取ることにより
sock=socket(AF_INET, SOCK_STREAM, 0);
if (socket < 0)
{
goto fail0;
}
struct sockaddr_in server;
server.sin_addr.s_addr = inet_addr(IPAddress);
server.sin_family = AF_INET;
server.sin_port = htons(Port);
if (connect(sock,(struct sockaddr *)&server, sizeof(server)))
{
goto fail1;
}
struct timeval tv;
tv.tv_sec = READ_TIMEOUT_MS/1000;
tv.tv_usec = (READ_TIMEOUT_MS % 1000) * 1000;
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)))
{
goto fail1;
}
return true;
fail1:
close(sock);
sock = -1;
fail0:
return false;
読む:
unsigned char buf[READ_BUFFER_SIZE];
int len = read(sock, buf, sizeof(buf));
if (len <= 0)
{
return NULL;
}
CBinaryDataStream* pData = new CBinaryDataStream(len);
pData->WriteToStream(buf, len);
return pData;
この質問は重複しないことを願っています私が尋ねる前に私が答えを捜したからです。 さらに詳しい情報が必要な場合はお知らせください。
:ここでは、面白いかもしれないいくつかの追加のリンクです。あなたはあなたが望むよりも少ないバイト数を得る準備が必要です。落とし穴5は実際にそれを意味します。この図は1024バイトの読み込みを示していますが、200バイトを返すテキストについての話です。 –
より簡単に制御できるタイムアウトについては、['select'](http://man7.org/linux/man-pages/man2/select.2.html)を調べるとよいでしょう。 – user4581301
@ n.m:このOSの動作を理解しました。しかし、 'read()'の呼び出しが毎回、必要なバイト数のバイトを返すのはなぜだろうかと思います。 – bushmills