Очистка потоков сокетов в программировании сокетов C - PullRequest
8 голосов
/ 31 января 2010

Я хотел знать, как очищать потоки сокетов при программировании сокетов в C. Я перепробовал все опции - установка TCP_NODELAY, используя следующий код -

setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));      

Примечание: все flag и sockfd объявлены правильно.

Я использовал эту функцию как до send(), так и после send(), но это не имело никакого значения.

Также кто-то предлагал использовать shutdown() после каждого send(), но это работает только для одного экземпляра. Когда я использую его для повторной отправки некоторого текста, это не работает - на самом деле соединение закрывается после того, как я использую shutdown().

shutdown(sockfd, SHUT_WR);

Может ли кто-нибудь помочь в этом отношении?

Я хотел добавить, что сервер - это сокет Java, а клиент - это сокет C. Сокет C реализует интерфейс JVMTI и отправляет информацию в сокет Java.

Ответы [ 5 ]

4 голосов
/ 31 января 2010

Проведя небольшое исследование в Google, не похоже, что есть способ явно очистить поток сокетов. Вы можете установить TCP_NODELAY, а затем он отключит алгоритм TCP Nagle . Это должно обеспечить немедленную отправку данных и не ждать, пока их буфер заполнится, перед отправкой.

Вы использовали wireshark или что-то еще, чтобы увидеть, что происходит за кулисами, когда вы устанавливаете TCP_NODELAY?

3 голосов
/ 01 февраля 2010

Возможно, вы захотите прочитать Последняя страница SO_LINGER или: почему мой tcp ненадежен , что, я думаю, применимо к вашей ситуации.

Edit:

Вызов send() на сокете TCP несколько раз не является чем-то необычным :) Я имею в виду нормальное использование. Возможно, у вас есть проблемы на стороне сервера, где сервер ожидает определенное количество байтов и блоков, ожидающих его.
Насколько я знаю, JVM TI не диктует никаких протоколов, поэтому вам придется придумать свой собственный. Определите структуру записи, которую отправляет клиент и ожидает сервер, поместите туда длину данных, если размер изменяется. Вы также можете реализовать некоторое подтверждение уровня приложения от сервера обратно к клиенту.

2 голосов
/ 05 сентября 2013

просто используйте fdopen. В Linux все что угодно - это файл. например.

FILE *f = fdopen(socketdescriptor, "w+");
. . .
n = write(socketdescriptor, "this is a message", 17);
fflush(f);

...
1 голос
/ 21 августа 2011

Вы не можете явно сбросить как сокет, так как данные всегда отправляются как можно скорее, принимая во внимание доступное пространство буфера на приемнике и необходимость избежать перегрузки сети. Установка TCP_NODELAY разрешает отправку пакетов, размер которых меньше максимального, в то время как все еще ожидают подтверждения.

0 голосов
/ 05 февраля 2010

socket-unix-faq говорит, что вы не можете сбросить сокеты

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