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 строки идут раздельно, потом опять каша... Раньше каша была после первой.
