Задать вопрос

Как настроить сетевой сокет в linux?

Здравствуйте, у меня два компьютера соединенные коммутатором. На одном запущена программа-сервер(А), на другом программа-клиент(Б). Между ними средствами сокетов беркли реализован протокол передачи данных такой: читаем первые четыре байта в них заложена длина сообщения(х) в байтах, получаем длину сообщения х+4, далее чтоб записать сообщение заполняем первые 4 байта значением оставшейся длины, записываем. Размеры буферов приема-передачи имеют фиксированный размер(для простоты, максимальный размер сообщения не больше чем размер буфера). Дак вот сначала, и А и В были на одном компе. и через них туда-обратно гонялось по петле по 16 гигов(не всегда программы завершались, иногда блокировались) а как вынес сервер на другой комп. (симулируя реальную сеть), стало приходить-уходить гораздо меньше данных, далее сервер на epoll_wait() ,блокировался. Кстати, сокеты блокируемые, это связано с простотой кода-главное следить за количеством передаваемой информации и все будет хорошо, по крайней мере раньше так думал).

Да, много написал) Но уже битую неделю ищу решение проблемы, а именно: "Что за хрень? через блокируемые сокеты передается известное обоим сторонам количество данных". Но они блокируются то на epoll_wait(), то на read/write, то программа полностью выполняется. Не ожидал я такого поведения, до этого работал с не блокируемыми сокетами с EPOLL (ET), все летало. Сейчас думается может добавить-изменить опции сокетов как на SOL_SOCKET ,так и на IPPROTO_TCP уровнях. Что скажете-посоветуете?

Да, еще добавлю: в некоторых запросах клиента если например в первых 4 байтах содержится -1, сервер не должен отвечать клиенту, вот после таких "однонаправленных" итераций чаще всего глохнет.

Походу придется писать дополнения под циферками:
1) Немного начинаю понимать. Написал прототип программ с искусственными размерами посылаемых сообщений чтоб точно знать где сколько должно прийти-уйти. Алгоритм состоит из 8 итераций, в первой, второй и третьей клиент шлет сообщения только по 4 байта со значением -1, сервет читает -1 при таком значении он не должен отвечать, клиент об этом знает, далее он шлет максимальный размер буфера, сервер читает и отдает также максимальный размер буфера, а далее нет и смысла объяснять) Просто первые три запроса запихались в буфер ядра и отослались серверу целиком, а сервер воспринял как один запрос. Далее пошел полный шлак. Так что не вижу другого выхода, придется читать, кусками сначала константный размер с длиной а потом уже все остальное( А можно по другому?
  • Вопрос задан
  • 295 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
gbg
@gbg Куратор тега Linux
Любые ответы на любые вопросы
Почитать учебник Снейдера по TCP/IP.
В частности, то место, где написано, что read (write) может считать меньше байт, чем у нее указано в качестве параметра.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы