Сбрасывание потоков сокета в программировании сокета C

Я хотел знать, как сбросить потоки сокета при выполнении программирования сокета в 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.

8
задан Mysticial 4 November 2012 в 01:32
поделиться

3 ответа

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

Редактирование:

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

3
ответ дан 5 December 2019 в 17:37
поделиться

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

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

4
ответ дан 5 December 2019 в 17:37
поделиться

socket-unix-faq: вы не можете очистить сокеты

0
ответ дан 5 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

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