Может кто-нибудь объяснить, когда именно функция чтения, которую я использую для получения данных из TCP-сокета, вернется?Когда возвращается read() на сокет TCP
Я использую приведенный ниже код для чтения из измерительной системы. Эта система обеспечивает передачу данных с частотой 15 Гц. READ_TIMEOUT_MS
имеет значение 200
Кроме того, READ_BUFFER_SIZE
имеет значение 40000
. Все работает нормально, но что происходит, read()
возвращает 15 раз в секунду с 1349
байтами.
Читая Pitfall 5 в следующей документации, которую я бы ожидать, что буфер заполнен полностью:
http://www.ibm.com/developerworks/library/l-sockpit/
Init:
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;
Read:
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;
Надеюсь, этот вопрос не дублируется, будь потому что я искал ответ, прежде чем я спросил. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Он возвращается всякий раз, когда операционная система чувствует, как он. Вы должны быть готовы получить меньше байтов, чем хотите. Pitfall 5 на самом деле подразумевает это. Диаграмма показывает чтение 1024 байта, но в тексте говорится об этом, возвращающем 200 байт. –
Возможно, вы захотите заглянуть в ['select'] (http://man7.org/linux/man-pages/man2/select.2.html) для более легкого контролируемого таймаута. – user4581301
@ н.м .: Я понял это поведение ОС. Но мне интересно, почему вызов 'read()' каждый раз возвращает желаемое количество байтов. – bushmills