GNU/Linux >> Znalost Linux >  >> Linux

Jak úplně zničit připojení zásuvky v C

close volání pouze označí zavřený soket TCP. Není již použitelný procesem. Ale jádro může stále po určitou dobu uchovávat nějaké zdroje (TIME_WAIT, 2MLS atd.).

Nastavení SO_REUSEADDR by mělo odstranit problémy s vázáním.

Ujistěte se tedy, že hodnota true je při volání setsockopt skutečně nenulové (chyba přetečení jej může přepsat):

true = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int))

Existuje pid proměnná je váš kód. Pokud používáte fork (pro zahájení procesů zpracování připojení), pak byste měli zavřít sock také v procesu, který to nepotřebuje.


Nejprve k pojmenování, takže všichni pojmenováváme stejné věci stejně:

Strana serveru:

Soket předán do listen() a poté na accept() nazvěme naslouchání socket.Soket vrácený accept() nazvěme přijaté zásuvka.

Strana klienta:

Soket předán do connect() nazvěme připojování/připojeno zásuvka.

K vašemu problému:

Chcete-li ukončit accept() ed připojení zavřete přijato zásuvka (co nazýváte připojeno) volitelně nejprve pomocí shutdown() následuje close () .

Chcete-li přijmout novou smyčku připojení těsně před voláním na accept() , ne přejděte přes bind() a listen() znovu.

Pouze vypnout a zavřete poslech zásuvky, pokud se chcete zbavit nevyřízených connect() s vydané po accept() vráceno.


Připojení je stále aktivní, protože jste zapomněli uzavřít připojenou zásuvku. Zavřením poslechového konektoru se automaticky nezavře připojený konektor.

//necessary code
close(connected);  // <---- add this line
close(sock);
goto label;

Nejsem si však jistý, proč dostáváte EADDRINUSE. Kód fungoval dobře na linuxu i mac os.


Linux
  1. Jak zvýšit časový limit připojení SSH

  2. Jak monitorovat sériové připojení @ 250 000 Baud?

  3. Jak na to:Programování soketů v Pythonu

  1. jak navázat raw socket na konkrétní rozhraní

  2. Python socket neuzavře připojení správně

  3. Jak se liší SO_REUSEADDR a SO_REUSEPORT?

  1. Jak ukončím připojení SSH?

  2. Jak určit dobu připojení soketu v systému Linux

  3. Jak zjistit, zda se používá připojení ssh ControlMaster