请问,当我使用用于从TCP套接字获取数据的读取函数时,它到底何时返回?
我使用以下代码从测量系统中读取数据。该系统以15 Hz的频率传输数据。 READ_TIMEOUT_MS的值为200,而READ_BUFFER_SIZE的值为40000。一切都运行良好,但发生的情况是,read()每秒返回15次,读取了1349个字节。
通过阅读以下文档中的陷阱5,我原本期望缓冲区会完全填满:
我使用以下代码从测量系统中读取数据。该系统以15 Hz的频率传输数据。 READ_TIMEOUT_MS的值为200,而READ_BUFFER_SIZE的值为40000。一切都运行良好,但发生的情况是,read()每秒返回15次,读取了1349个字节。
通过阅读以下文档中的陷阱5,我原本期望缓冲区会完全填满:
http://www.ibm.com/developerworks/library/l-sockpit/
初始化:
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;
我希望这个问题不是重复的,因为在提问之前我已经搜索了答案。如果您需要进一步的信息,请告诉我。
select
,以获得更易于控制的超时。 - user4581301read()
都会返回所需的字节数。 - bushmills