Использование recv с флагом MSG_PEEK

Ответить
Аватара пользователя
hasherfrog

Использование recv с флагом MSG_PEEK

Сообщение hasherfrog »

Что-то я никак не могу разобраться вот с какой проблемой:

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

Re: Использование recv с флагом MSG_PEEK

Сообщение hasherfrog »

Ладно, я так и думал.

[url=
http://www.codeguru.com/forum/viewtopic.php?t=149762
[/url]

Уже один раз разруливал такую ситуацию, с пайпами. Теперь и с сокетами придётся.

Изображение
Ответить

Вернуться в «Программирование и базы данных»