Bind mislukt: adres al in gebruik

Ik probeer een stopcontact te binden aan een poort hieronder:

if( bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0)
{
    perror("bind failed. Error");
    return 1;
}
puts("bind done");

maar het geeft:

$ ./serve   
Socket created    
bind failed. Error: Address already in use

Waarom gebeurt deze fout?


Antwoord 1, Autoriteit 100%

De fout betekent meestal dat de poort die u probeert te openen al door een andere toepassing wordt gebruikt. Probeer NetStat te gebruiken om te zien welke poorten open zijn en vervolgens een beschikbare poort gebruiken.

Controleer ook of u bindend bent aan het rechter IP-adres (ik neem aan dat het localhost zou zijn)


Antwoord 2, Autoriteit 178%

Iedereen is correct. Als u echter ook bezig bent met het testen van uw code, kan uw eigen -toepassing nog steeds “eigen” de aansluiting “eigen” eigen “eigen” bezit als deze relatief snel stopt en stopt. Probeer SO_RESEADDR als een optie aansluiting:

Wat doet SO_RESEADDR precies?

Deze socketoptie vertelt de kernel dat zelfs als deze poort bezet is (in
De TIME_WAIT-staat), ga je gang en hergebruik het hoe dan ook. Als het druk is,
Maar met een andere staat krijgt u nog steeds een adres al in gebruik
fout. Het is handig als uw server is uitgeschakeld en dan
meteen opnieuw opgestart terwijl aansluitingen nog steeds actief zijn op zijn haven. Jij
moet zich ervan bewust zijn dat als er onverwachte gegevens binnenkomt, het kan verwarren
uw server, maar hoewel dit mogelijk is, is het niet waarschijnlijk.

Er is op gewezen dat “een socket een 5 tuple is (proto, lokaal
addr, lokale poort, externe addr, externe poort). SO_REUSEADDR zegt gewoon
dat u lokale adressen opnieuw kunt gebruiken. De 5 tupel moet nog steeds zijn
uniek!” door Michael Hunter ([email protected]). Dit is waar, en dit
daarom is het zeer onwaarschijnlijk dat onverwachte gegevens ooit zullen worden gezien door
uw server. Het gevaar is dat zo’n 5 tupel nog steeds zweeft
rond op het net, en terwijl het rondstuitert, een nieuwe verbinding
van dezelfde client, op hetzelfde systeem, krijgt toevallig hetzelfde
afgelegen poort. Dit wordt uitgelegd door Richard Stevens in “2.7 Please
leg de TIME_WAIT-status uit.”.


Antwoord 3, autoriteit 94%

Je hebt een proces dat die poort al gebruikt. netstat -tulpnstelt iemand in staat om de proces-ID te vinden die een bepaalde poort gebruikt.


Antwoord 4, autoriteit 91%

Address already in usebetekent dat de portdie u probeert toe te wijzen voor uw huidige uitvoering, al bezet/toegewezen is aan een ander proces.

Als je een ontwikkelaar bent en aan een applicatie werkt die veel getest moet worden, kan het zijn dat er een instantie van dezelfde applicatie op de achtergrond draait (misschien ben je vergeten deze goed te stoppen)

Dus als je deze fout tegenkomt, kijk dan welke applicatie/proces de poort gebruikt.

Probeer in Linux netstat -tulpnte gebruiken. Met deze opdracht wordt een lijst met processen weergegeven met alle lopende processen.

Controleer of een toepassing uw poort gebruikt.Als die toepassing of dat proces een andere belangrijke is, wilt u misschien een andere poort gebruiken die door geen enkel proces wordt gebruikt/ applicatie.

Hoe dan ook, je kunt het proces dat je poort gebruikt stoppen en je applicatie het laten overnemen.

Als u zich in een linux-omgeving bevindt, probeer dan,

  • Gebruik netstat -tulpnom de processen weer te geven
  • kill <pid>Hiermee wordt het proces beëindigd

Als u Windows gebruikt,

  • Gebruik netstat -a -o -nom het poortgebruik te controleren
  • Gebruik taskkill /F /PID <pid>om dat proces te beëindigen

Antwoord 5, autoriteit 20%

Zoals hierboven vermeld, is de poort al in gebruik.
Dit kan verschillende redenen hebben

  1. een andere toepassing maakt er al gebruik van.
  2. De poort bevindt zich in de status close_waitwanneer uw programma wacht tot het andere uiteinde de program.refer sluit (https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state).
  3. Het programma heeft mogelijk de status time_wait. je kunt wachten of socketoptie SO_REUSEADDRgebruiken zoals vermeld in een ander bericht.

Doe netstat -a | grep <portno>om de poortstatus te controleren.


Antwoord 6, autoriteit 2%

Dat probleem had ik ook, maar ik heb het opgelost.
Zorg ervoor dat zowel de programma’s voor client-side als server-side zich op verschillende projectenin je IDE bevinden,in mijn geval NetBeans. In de veronderstelling dat je localhost gebruikt, raad ik je aan om beide programma’s als twee verschillende projectente implementeren.


Antwoord 7, autoriteit 2%

Het gebeurt ook als je niet genoeg rechten (lezen en schrijven) hebt gegeven aan je sokkenbestand!

Voeg gewoon de verwachte toestemming toe aan uw sokmap en uw sokkenbestand:

chmod ug+rw /path/to/your/
 chmod ug+rw /path/to/your/file.sock

Veel plezier!


Antwoord 8

Als het adres al in gebruik is, wil je dan gewoon het proces dat de poort gebruikt, uitschakelen, dan kun je

lsof -ti:PortNumberGoesHere | xargs doden -9

bron en inspiratie dit.

PS: kon netstat niet gebruiken omdat het nog niet geïnstalleerd was.

Other episodes