C & stato socket

Postate qui per tutte le discussioni legate a Linux in generale.

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.
Rispondi
Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

C & stato socket

Messaggio da tgmx »

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.

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

Piano, con stato del socket cosa intendi? Le opzioni o gli stati come TIME_WAIT o LAST_ACK ecc..

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio da tgmx »

gallows ha scritto:Piano, con stato del socket cosa intendi? Le opzioni o gli stati come TIME_WAIT o LAST_ACK ecc..
Hai ragione... :)
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.

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

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:
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.
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.
Se è una funzione opaca che ti restiruisce il sockfd.. uhm, ci devo pensare :)

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

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.

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio da tgmx »

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.
Intanto grazie della collaborazione... :)
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.

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

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.

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio da tgmx »

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.
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()?

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »


Rispondi