передача сообщений по протоколу TCP - PullRequest
1 голос
/ 22 ноября 2010

Привет, я хочу использовать TCP соединение для отправки / получения сообщений.Вопрос в том, что я хочу отправить много сообщений и измерить задержки.Таким образом, я не хочу получать после каждого отправленного сообщения.Однако, если я не обработаю входящие сообщения вовремя, программа всегда получит неожиданный результат.Есть ли способ, которым я могу обработать recv (), не блокируя мою программу отправки сообщений?Любые комментарии будут оценены.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

Измерение задержки с использованием TCP, возможно, не является оптимальной идеей, поскольку TCP обязательно вводит собственную задержку (см. алгоритм Нейгла ).TCP подразумевается как поток байтов, он даже не имеет четкого представления о «сообщениях».

Вы можете установить сокет как неблокирующий , что приведет кrecv() чтобы немедленно вернуться, если нет данных.Если вы не хотите тратить ЦП на опрос, вместо этого вы можете использовать <a href="http://linux.die.net/man/2/select" rel="nofollow">select()</a>, чтобы определить, когда сокет имеет данные, доступные для чтения.

0 голосов
/ 22 ноября 2010

Один из вариантов, о которых я здесь не упоминал, - использовать отдельную нить для получения Таким образом, вы можете заставить ваши простые тупые блокировки ждать, не мешая (сильно) вашей логике отправки в другом потоке.

0 голосов
/ 22 ноября 2010

Вы можете использовать select() для проверки доступности входящих данных.

...