Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    18

    [C]liberare socket server

    mi sto esercitando un po' nella creazione di vari server e client tramite socket. ho però un problema: quando il server invoca la accept, si mette in attesa. in questo momento io non ho ancora un client con cui rispondere a quella accept, quindi se killo il processo e poi provo a far ripartire il server mi viene restituito un errore EADDRINUSE. come posso risolvere?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    O attendi qualche secondo/minuto ogni volta oppure abiliti l'opzione SO_REUSEADDR con setsockopt() sulla socket.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    18
    attendere qualche minuto direi di no....potresti farmi un esempio di uso della chiamata setsockopt con quel flag?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    In giro ne trovi di esempi, vedi qui per dirne uno.
    Quella variabile opt devi dichiararla per forza: in questo caso specifico è un po' macchinoso passare alla funzione una variabile contenente 0 o 1 (basterebbe passarle semplicemente il valore costante) ma ciò dipende dal fatto che setsockopt() è una funzione generica che in quel campo prevede puntatori di diverso tipo a seconda dell'opzione che si vuole impostare.
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    18
    ti ringrazio ancora per l'aiuto. devo però dire che ho provato ad usare il pezzo di codice dell'esempio da te indicato. eppure se killo il processo(un server), e poi lo lancio nuovamente(sempre sulla stessa porta es.9000) l'errore restituito è sempre lo stesso

    "creazione socket stream"
    bind error
    : Address already in use

    "creazione socket stream" è una stringa che gli faccio stampare per vedere se esegue quel pezzo di codice.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    18
    faccio una ulteriore precisazione. se avvio il server in questione e poi faccio crtl+z, il server si ferma ma ancora risulta tra i processi aperti(ps -e) e anche in ascolto(netstat -ap).
    a questo punto se lo lancio di nuovo, ricevo un errore di tipo bind address already in use.
    per liberare quella porta devo andare con un bell "kill -9 pid". questo però mi sembra un modo piuttosto brutale e ovvio di liberare la risorsa....

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    ctrl + z non termina il processo ma lo sospende soltanto, quindi è ovvio che l'indirizzo risulti sempre "in uso". kill -9 invia il segnale SIGKILL al processo che in effetti è una chiusura "brutale", ma se imposti quell'opzione allora anche con un SIGINT (o ctrl + c) non dovresti avere problemi.
    every day above ground is a good one

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    18
    ti ringrazio...ho provato sia con la funzione da te segnalata, sia senza ed effettivamente funziona(ovviamente con crtl+c).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.