View Full Version : [C] Problemi con i Socket
Salve sto realizzando un piccolo programmino con i socket (è la prima volta che li uso) mi viene sempre riportato in runtime il seguente errore:
: Socket operation on non-socket
Questa è la parte di codice incriminata:
int get_connection(int s){
81
82 struct sockaddr_in isa;
83 int i,t;
84
85 i=sizeof(isa);
86
87 if (( t=accept(s,(struct sockaddr *)&isa,(socklen_t *)&i) ) < 0){
88 printf("errno=%s\n",strerror(errno));
89 return -1; //si mette in attesa di una connessione
90 }
91
92 return(t);
Il socket s che viene passato alla funzione è stato creato precedentemente con socket e con bind. Ho notato che il file descriptor del socket s è sempre 0.
ma t lo usi come socket?
questo è il man della accept:
http://www.hmug.org/man/2/accept.php
sottovento
03-06-2006, 12:22
Sembra proprio che s non sia un socket valido.
L'hai aperto correttamente? Fatto il bind? Listen?
Controlla e facci sapere
High Flying
Sottovento
Sembra proprio che s non sia un socket valido.
L'hai aperto correttamente? Fatto il bind? Listen?
Controlla e facci sapere
High Flying
Sottovento
Ecco come ho aperto il socket:
int establish(u_short port){
char myname[MAXHOSTNAME+1];
int s;
struct sockaddr_in sa;//struttura di AF_INET
struct hostent *hp; //struttura restituita da gethostbyname
bzero(&sa,sizeof(struct sockaddr_in) );
gethostname(myname,MAXHOSTNAME);
printf("Host: %s\n",myname);
hp=gethostbyname(myname);
if ( hp == NULL) return -1;
sa.sin_family=hp->h_addrtype; //riempo la strutta struct sockaddr_in
sa.sin_port=htons(port);
if( (s=socket(PF_INET,SOCK_STREAM,0)) < 0)
return -1;
//sa2=(struct sockaddr)
if ( bind(s,(struct sockaddr *)&sa,(socklen_t) sizeof (sa)) < 0) {
close(s);
return(-1);
}
listen(s,3);
return(s);
}
sottovento
04-06-2006, 15:40
Mi era scappata la parte in cui dicevi che il descrittore e' sempre zero.
Per caso hai chiuso lo standard input, o fai partire l'applicazione mediante una pipe o qualcosa del genere?
Come ben sai, in caso di funzionamento "normale" (standard input/output/error aperti), la funzione socket() non puo' riportarti un descrittore pari a zero. Questo ovviamente ti fa generare l'errore che ti ritrovi nell'accept.
Ho dato un'occhiata al codice e sembra tutto in ordine. Ovviamente ci deve essere una gabola, da qualche parte, altrimenti funzionerebbe :) (non riesco a credere agli incantesimi informatici).
Proviamo a creare una checklist per trovare un possibile errore:
1 - la variabile s e' valorizzata SOLO dalla funzione socket(). Qualsiasi altra valorizzazione potrebbe portare errore. Confermi?
2 - la funzione establish() potrebbe terminare con un errore. Hai messo il controllo?
3 - Hai altre variabili con lo stesso nome che potrebbero, nel blocco di programma in questione, "oscurare" la tua variabile? (magari credi di vedere quella e stai guardando un'altra)...
4 - Il vettore myname[MAXHOSTNAME+1] e' sufficiente a contenere il nome dell'host + il corrispondente terminatore di stringa?
Controlla bene il punto 3, mi sembra il piu' probabile. Se non trovi niente, proviamo a creare un'altra checklist
High Flying
Sottovento
Mi era scappata la parte in cui dicevi che il descrittore e' sempre zero.
Per caso hai chiuso lo standard input, o fai partire l'applicazione mediante una pipe o qualcosa del genere?
Come ben sai, in caso di funzionamento "normale" (standard input/output/error aperti), la funzione socket() non puo' riportarti un descrittore pari a zero. Questo ovviamente ti fa generare l'errore che ti ritrovi nell'accept.
Ho dato un'occhiata al codice e sembra tutto in ordine. Ovviamente ci deve essere una gabola, da qualche parte, altrimenti funzionerebbe :) (non riesco a credere agli incantesimi informatici).
Proviamo a creare una checklist per trovare un possibile errore:
1 - la variabile s e' valorizzata SOLO dalla funzione socket(). Qualsiasi altra valorizzazione potrebbe portare errore. Confermi?
2 - la funzione establish() potrebbe terminare con un errore. Hai messo il controllo?
3 - Hai altre variabili con lo stesso nome che potrebbero, nel blocco di programma in questione, "oscurare" la tua variabile? (magari credi di vedere quella e stai guardando un'altra)...
4 - Il vettore myname[MAXHOSTNAME+1] e' sufficiente a contenere il nome dell'host + il corrispondente terminatore di stringa?
Controlla bene il punto 3, mi sembra il piu' probabile. Se non trovi niente, proviamo a creare un'altra checklist
High Flying
Sottovento
Ti ringrazio per l'aiuto, ho rivisto il codice e leggendo la tua cecklist non ho trovato nulla che viola i 4 punti. Non ho chiuso lo stdin e non uso pipe, il programma è un server che fa l'eco. Riceve dal client una stringa e la rimanda allo stesso client. Ora ti mando il main:
int main(int argc,char **argv){
int t,s;
int port=atoi(argv[1]);
if (s=establish( (u_short)port ) < 0){
perror("establihs\n"); exit(2);}
printf("Socket fd=%d\n",s);
while (1){
if( (t=get_connection(s) ) < 0 ){
perror("get_connection\n"); exit(0);}
switch(fork()) {
case -1:
perror("fork");
close(s);
close(t);
exit(1);
case 0: //figlio
eco(t);
exit(0);
default : //padre
close(t);
continue;
}
}
}
ho trovato ecco l'errore non ci sono le parentesi:
if (s=establish( (u_short)port ) < 0)
sottovento
06-06-2006, 10:40
ho trovato ecco l'errore non ci sono le parentesi:
if (s=establish( (u_short)port ) < 0)
Complimenti, era davvero difficile da trovare. Ho controllato il codice diverse volte e mi era clamorosamente scappato.
Potremmo formulare la proposta di avere una bug parade o una sezione di rompicapi informatici, questo entrerebbe di diritto......
High Flying
Sottovento
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.