Я хотел знать, как сбросить потоки сокета при выполнении программирования сокета в 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.
Возможно, вы захотите прочитать Окончательную страницу SO_LINGER, или: почему мой tcp ненадежен, что, как мне кажется, применимо к вашей ситуации.
Многократный вызов send()
на TCP-сокете не так уж и редко :) Это нормальное использование. Вероятно, у вас проблемы на стороне сервера, где сервер ожидает определенное количество байт и блоков, ожидающих его.
Насколько я знаю, JVM TI не диктует никаких сверхпроводных протоколов, так что вам придется придумать свой собственный. Определите структуру записи, которую посылает клиент, и которую ожидает сервер, поместите туда длину данных, если ее размер варьируется. Вы также можете реализовать некоторое подтверждение на уровне приложения от сервера обратно к клиенту.
Делать немного исследований в Google, не похоже, что есть способ промывать поток сокета явно. Вы можете установить TCP_Nodelay, а затем выключит TCP Nagle Algorithm . Это должно убедиться, что данные отправляются немедленно и не ждать, пока он не будет заполнен перед отправкой.
Вы использовали Wireshark или что-то, чтобы увидеть, что происходит за кулисами, когда вы устанавливаете TCP_Nodelay?