170 похожих чатов

Всем привет, поясните, что происходит. Разбираюсь с сокетами, есть комп

и ноут, подключены к роутеру по wifi. На ноуте запускаю своё серверное приложение, которое принимает соединение и принимает нему данные. На компе запускаю свою клиентскую программу, где по командам вызываю методы connect, close, shutdown, disconnect итд. После коннекта запускаю передачу 1ГБ данных
1) Если на подключенном клиенте вызвать Close(), отправится пакет RST, передача оборвется, всё логично.
2) Если вызвать shutdown и затем disconnect и close(), то данные продолжат передаваться, даже после закрытия программы. Видимо из-за вызова shutdiwn ОС удерживает сокет и обеспечивает передачу ранее установленных данных
3) Но если после передачи я вызываю метод disconnect, то поведение ничем не отличается от предыдущего случая. Данные продолжают передаваться после закрытия программы. Почему?

7 ответов

7 просмотров

net core или framework?

как вы данные передаете?

Скорее всего дело в опции Linger, попробуйте отключить её. Socket LingerState.Enabled=false Disconnect не завершает соединение

Константин- Автор вопроса
Пользователь 6197e
Скорее всего дело в опции Linger, попробуйте отклю...

отправляю через socket.send(byte[]), спасибо, почитаю и попробую

Константин
отправляю через socket.send(byte[]), спасибо, почи...

Shutdown гарантирует что будут отправлены все данные. (Linger)

Константин- Автор вопроса
Пользователь 6197e
Shutdown гарантирует что будут отправлены все данн...

насколько я понял, Linger определяет сколько времени сокет будет жить после вызова Close и сколько времени он будет пытаться передать данные. У меня по умолчанию он был отключен. Непонятно, почему при вызове disconnect без вызова shutdown данные продолжают передаваться

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

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта