необработанный сокет в обход заголовков tcp / ip - PullRequest
0 голосов
/ 27 августа 2011

У меня есть 2 программы, которые общаются через сокеты на одном компьютере.В настоящее время 1,6 миллиона байтов занимает около 7 секунд для передачи с использованием TCP / IP.Мне нужно сделать это быстро.

Если я вместо этого использую необработанный сокет и игнорирую заголовки TCP / IP, то это должно увеличить скорость?Что еще я могу сделать, чтобы увеличить скорость?Является ли опция SOCKET_RAW прямой копией или она делает что-то еще?

Ответы [ 4 ]

6 голосов
/ 27 августа 2011

1,6 МБ не должно занимать 7 секунд при использовании «обычного» TCP / IP - конечно, не на той же машине! Это говорит о том, что у вас где-то неэффективный код. Я бы обратился к этому, прежде чем пытаться сделать что-то «особенное» с точки зрения сетевого взаимодействия.

РЕДАКТИРОВАТЬ: Я только что написал короткую программу на C # для нетбука, и она передает 2 МБ (генерируя случайные данные по ходу) за 279 мс. Это без оптимизации. Если вы не работаете на машине 1980-х годов, вы должны определенно получить лучшую производительность, чем эта ...

1 голос
/ 27 августа 2011

Чтобы получить такую ​​низкую производительность, вы делаете что-то очень неэффективное. Возможно, операции ввода-вывода являются однобайтовыми?

Переход на необработанные сокеты - плохая идея. Чтобы получить надежную связь, вам потребуется добавить некоторую проверку данных, последовательность и т. Д. И т. Д. - все, что делает TCP для надежности.

Если целью является передача данных от одного процесса другому на одной машине, используйте общую память и мьютекс для синхронизации доступа. Конечно, это не очень хорошее решение, если программы в конечном итоге должны будут работать на разных машинах.

1 голос
/ 27 августа 2011

Попробуйте вместо этого использовать Unix Domain Sockets.

0 голосов
/ 27 августа 2011

Нет, использование сырых IP-сокетов определенно не очень хорошая идея.Использование сокета unix-domain может быть незначительно более эффективным, но я сомневаюсь, что это решит вашу проблему.У вас явно есть другая проблема.Возможно, это ваш протокол уровня приложения, который неэффективен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...