Войти

Показать полную графическую версию : Использование recv с флагом MSG_PEEK


hasherfrog
26-07-2004, 18:24
Что-то я никак не могу разобраться вот с какой проблемой:
1. Сервер и клиент устанавливают соединение. Сервер многотридовый. Клиент однотридовый. Сокет самый обычный,socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )Единственное, что сервер делает, в отличие от клиента - метит сокет как fcntl(g_nBindSocket, F_SETFL, O_NONBLOCK);
2. Сервер посылает клиенту кучу строк. Каждая строка посылается отдельным send;
3. Клиент принимает строки. Есть "синхронизирующая" стартовая строка, есть "завершающая". Перед зачиткой в буфер клиент сначала делает recv с флагом MSG_PEEK, определяет размер буфера, выделяет память под сообщение, потом снова делает туда recv, уже без MSG_PEEK. Коряво я как-то объясняю, но на практике всё должно работать. Но работает только в 3-4% случаев. Клиент почему-то получает все строки, скопом. То в 97% случаев есть на один recv(m_fdOfSocket, msg, nRealSize, MSG_PEEK); приходят сразу все send'ы. Стартовая последовательность приходит нормально. А вот собственно строки - кучей.

Т.е. если "быстро-быстро" делать send, сообщений будет для recv будет не много, а одно, но большое.
ПОЧЕМУ???

Добавлено:

ПС. Сервер всё отсылает правильно (на уровне моей проги).

Предположения.
Должен ли я устанавливать принудительно TCP_NODELAY?


Добавлено:

TCP_NODELAY не помогает. Первые 2 строки идут раздельно, потом опять каша... Раньше каша была после первой.

hasherfrog
27-07-2004, 10:00
Ладно, я так и думал.
http://www.codeguru.com/forum/showthread.php?t=296198
Уже один раз разруливал такую ситуацию, с пайпами. Теперь и с сокетами придётся.
:splat:




© OSzone.net 2001-2012