Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Использование recv с флагом MSG_PEEK (http://forum.oszone.net/showthread.php?t=29557)

hasherfrog 26-07-2004 18:24 204554

Что-то я никак не могу разобраться вот с какой проблемой:
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 204555

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


Время: 17:46.

Время: 17:46.
© OSzone.net 2001-