C & stato socket
Moderatore: Staff
Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
C & stato socket
Ciao Ragazzi,
spero possiate aiutarmi, devo riuscire a conoscere lo stato di un socket aperto da una funzione alla quale non ho accesso che mi ritorna solamente un intero che rappresenta l'fd del socket. Il tutto in c/c++.
Googlando un po' sembra che si possa fare con getsockopt(...) ma non ho capito molto bene come.
spero possiate aiutarmi, devo riuscire a conoscere lo stato di un socket aperto da una funzione alla quale non ho accesso che mi ritorna solamente un intero che rappresenta l'fd del socket. Il tutto in c/c++.
Googlando un po' sembra che si possa fare con getsockopt(...) ma non ho capito molto bene come.
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
Hai ragione...gallows ha scritto:Piano, con stato del socket cosa intendi? Le opzioni o gli stati come TIME_WAIT o LAST_ACK ecc..
Intendo dire che dovrei sapere se la connessione è caduta o è ancora attiva. Vorrei avere risposte tipo "IDLE", "CONNECTED", "CLOSED" un po' come accade in qt usando il metodo state() su una classe QSocket.
- gallows
- Staff

- Messaggi: 3471
- Iscritto il: lun 20 set 2004, 0:00
- Desktop: cwm
- Distribuzione: OpenBSD
- Località: ~/
- Contatta:
Uhm, io uso netstat per il debug delle connessioni. Sinceramente nella libreria POSIX che ho studiato non mi pare ci sia una funzione del genere, non conosco il framework Qt per le connessioni, ma sarebbe interessante leggere l'implementazione di QSocket::state()
Forse è possibile farlo con qualche chiamata di sistema o leggendo i file in /proc/net/
Se hai proprio bisogno di avere lo stato all'interno del programma e non riesci a trovare risposte, prova a chiedere su comp.os.linux.networking o leggere il sorgente del metodo Qt.
UPDATE:
Se è una funzione opaca che ti restiruisce il sockfd.. uhm, ci devo pensare
Forse è possibile farlo con qualche chiamata di sistema o leggendo i file in /proc/net/
Se hai proprio bisogno di avere lo stato all'interno del programma e non riesci a trovare risposte, prova a chiedere su comp.os.linux.networking o leggere il sorgente del metodo Qt.
UPDATE:
Beh, conoscere queste cose è abbastanza semplice... ad esempio se programmi in C++ basta che la classe Socket abbia un membro per salvare lo stato. Quelle operazioni le fai tu, non ci vuole molto ad implementare un controllo. Pensavo fosse qualcosa più a basso livello, come l'output di netstat.QSocket::State
This enum defines the connection states:
* QSocket::Idle - if there is no connection
* QSocket::HostLookup - during a DNS lookup
* QSocket::Connecting - during TCP connection establishment
* QSocket::Connected - when there is an operational connection
* QSocket::Closing - if the socket is closing down, but is not yet closed.
Se è una funzione opaca che ti restiruisce il sockfd.. uhm, ci devo pensare
- gallows
- Staff

- Messaggi: 3471
- Iscritto il: lun 20 set 2004, 0:00
- Desktop: cwm
- Distribuzione: OpenBSD
- Località: ~/
- Contatta:
Allora, sostanzialmente a te interessa sapere se quel fd è usabile, no? Questa funzione di cosa si occupa di preciso? Perché alla fine HostLookUp, Connecting e Closed non credo ti servano. Per sapere se un socket è utilizzabile puoi usare getsockname(), se il socket non è connesso restituisce -1, altrimenti nei parametri passati (se diversi da NULL, ovviamente) scrive la struttura del socket.
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
Intanto grazie della collaborazione...gallows ha scritto:Allora, sostanzialmente a te interessa sapere se quel fd è usabile, no? Questa funzione di cosa si occupa di preciso? Perché alla fine HostLookUp, Connecting e Closed non credo ti servano. Per sapere se un socket è utilizzabile puoi usare getsockname(), se il socket non è connesso restituisce -1, altrimenti nei parametri passati (se diversi da NULL, ovviamente) scrive la struttura del socket.
La funzione effettua la connessione ad un dispositivo (tipo plc) via ethernet e con delle funzioni di libreria posso comunicare con quel dispositivo. Il problema è che se stacco il cavo di rete o magari spengo il dispositivo ho dei problemi scrivendo sul socket. Dovrei sapere se la connessione è ancora attiva prima di scrivere e credo che a basso livello il sistema operativo sappia che ho staccato il cavo di rete, si tratta di recuperare questa informazione partendo dall'fd.
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
Non conoscevo questa funzione, la approfondisco un attimo e faccio alcune prove. Per caso hai qualche link in cui trovare esempi di codice sull'uso di poll()?gallows ha scritto:Ok, per controllore gli eventi su un dato fd puoi usare la funzione poll()
Ad esempio come evento in riposta puoi ricevere un POLLHUP che significa che il dispositivo è disconnesso.