[C - Socket] Processo in background?

hee136
int ricevuta;	
const int length = 8192;
char buffer[length];
struct iphdr *headerip;

int s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
while(1) {		
	printf("Sto per leggere ... \n");
	ricevuta = read(s, buffer, length);
	printf("Esito ricezione: %d \n",ricevuta);
	headerip = buffer;
	printf("Ho letto ... \n");
}


Ho scritto il seguente codice per realizzare un processo che riceve tutti i pacchetti IP da quando viene lanciato.
Solo che dopo averne ricevuti qualcuni, il processo sembra uscire e restituisce il controllo all'utente (banalmente la console mi stampa la linea di comando e attende che io inserisca un comando).
Non capisco nè cosa fa nè perchè lo fa.

Apparentemente sembrerebbe continuare ad essere eseguito in stato di background ma, se così fosse, non capisco perchè lo fa e perchè altre volte non lo faceva.

Anticipo un grazie a chi mi darà una mano :)

Risposte
hamming_burst
Ciao,
questo è il codice completo?

non programmo socket in C da un po', ma mi sembra manca tutto. Questo è il server?

hee136
"hamming_burst":
Ciao,
questo è il codice completo?

non programmo socket in C da un po', ma mi sembra manca tutto. Questo è il server?


Questa è la seconda parte che ho sviluppato.
La prima è il processo che invia un pacchetto IP.

Il problema è che questa parte, anzichè rimanere all'interno del ciclo while dopo aver ricevuto il primo pacchetto, sembra uscire e terminare (ovvero restituisce il controllo all'interprete dei comandi e rimane in attesa che io inserisca un comando nella shell).

hee136
Il comportamento che dovrebbe avere è il seguente:
1 - esecuzione istruzioni prima del while
2 - entra nel while e rimane fermo alla read finchè non riceve un pacchetto
3 - prosegue con le istruzioni successive alla read
4 - torna a 2

Mentre quello che osservo è:
1 - esecuzione istruzioni prima del while
2 - entra nel while e rimane fermo alla read finchè non riceve un pacchetto
3 - prosegue con le istruzioni successive alla read
4 - metti il processo in sleep e torna alla linea di comando

(La parte rossa è quella corretta. Nel post sopra ho usato una frase equivoca.
Mi accorgo che il processo è in sleep perchè vedo il suo stato con il comando linux ps).

Il problema è: perchè va in sleep?

yoshiharu
(Disclaimer: non sono un esperto, so giusto due o tre cose.)

"hee136":

Mentre quello che osservo è:
1 - esecuzione istruzioni prima del while
2 - entra nel while e rimane fermo alla read finchè non riceve un pacchetto
3 - prosegue con le istruzioni successive alla read
4 - metti il processo in sleep e torna alla linea di comando

Il problema è: perchè va in sleep?


Riguardo al tuo problema, secondo me quello che scrivi non e' quello che effettivamente succede.
In generale, prima crei il nome del socket con socket(), poi devi usare bind() per collegarlo a un indirizzo, poi devi metterti in ascolto con listen(). Successivamente crei il nuovo socket con la connessione con accept().
Read ritorna solo il numero di byte letti, e dal codice non sembra che tu ti sinceri di cosa venga effettivamente letto.
Fai la prova a far stampare sullo schermo il buffer letto, per vedere cosa c'e' dentro. Poiche' il socket non e' bindato non credo che possa esserci niente di sensato. Magari qualche condizione di errore? Boh...confesso di non saperlo...

hee136
"yoshiharu":
(Disclaimer: non sono un esperto, so giusto due o tre cose.)

[quote="hee136"]
Mentre quello che osservo è:
1 - esecuzione istruzioni prima del while
2 - entra nel while e rimane fermo alla read finchè non riceve un pacchetto
3 - prosegue con le istruzioni successive alla read
4 - metti il processo in sleep e torna alla linea di comando

Il problema è: perchè va in sleep?


Riguardo al tuo problema, secondo me quello che scrivi non e' quello che effettivamente succede.
In generale, prima crei il nome del socket con socket(), poi devi usare bind() per collegarlo a un indirizzo, poi devi metterti in ascolto con listen(). Successivamente crei il nuovo socket con la connessione con accept().
Read ritorna solo il numero di byte letti, e dal codice non sembra che tu ti sinceri di cosa venga effettivamente letto.
Fai la prova a far stampare sullo schermo il buffer letto, per vedere cosa c'e' dentro. Poiche' il socket non e' bindato non credo che possa esserci niente di sensato. Magari qualche condizione di errore? Boh...confesso di non saperlo...[/quote]

Ti ringrazio della risposta :)

Listen() e accept() sono primitive per socket TCP (connection-oriented e affidabile) ovvero consentono di accedere al payload di pacchetti TCP. Io non le utilizzo perchè voglio accedere all'header IP.
Quindi utilizzo un socket Raw ovvero consente di accedere dall'header IP in avanti.
Ciò che viene letto è effettivamente ciò che ho mandato.

Mi sono accorto in ritardo che forse ho sbagliato a porre la domanda.
Ciò che non capisco è: perchè il processo, che si occupa di leggere, viene messo in stato sleep dopo aver letto?

apatriarca
Sei certo che non sia in stato di sleep perché in attesa di un nuovo pacchetto dal socket? Una volta che avviene un ciclo di lettura, si passa automaticamente al successivo.

yoshiharu
"hee136":

Quindi utilizzo un socket Raw ovvero consente di accedere dall'header IP in avanti.


:oops:

Confesso di essere andato in automatico dopo aver letto 'socket' e non aver letto cio' che c'era nelle parentesi...

Rggb1
"hee136":
Mentre quello che osservo è:
1 - esecuzione istruzioni prima del while
2 - entra nel while e rimane fermo alla read finchè non riceve un pacchetto
3 - prosegue con le istruzioni successive alla read
4 - metti il processo in sleep e torna alla linea di comando

:?: Come può essere?

- Come hai compilato?
- Se metti un po' di codice aggiuntivo per controllare se socket() e read() danno errore, cosa ti vien fuori?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.