|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2004
Città: Napoli
Messaggi: 342
|
[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:
Codice:
: Socket operation on non-socket Codice:
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 futuro lo conoscerete quando sarà arrivato, prima di allora dimenticatelo. (Eschilo) |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
__________________
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Sembra proprio che s non sia un socket valido.
L'hai aperto correttamente? Fatto il bind? Listen? Controlla e facci sapere High Flying Sottovento
__________________
In God we trust; all others bring data |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2004
Città: Napoli
Messaggi: 342
|
Quote:
Codice:
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);
}
__________________
Il futuro lo conoscerete quando sarà arrivato, prima di allora dimenticatelo. (Eschilo) Ultima modifica di osa : 04-06-2006 alle 12:16. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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 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
__________________
In God we trust; all others bring data |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2004
Città: Napoli
Messaggi: 342
|
Quote:
Codice:
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;
}
}
}
__________________
Il futuro lo conoscerete quando sarà arrivato, prima di allora dimenticatelo. (Eschilo) |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2004
Città: Napoli
Messaggi: 342
|
ho trovato ecco l'errore non ci sono le parentesi:
Codice:
if (s=establish( (u_short)port ) < 0)
__________________
Il futuro lo conoscerete quando sarà arrivato, prima di allora dimenticatelo. (Eschilo) |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Potremmo formulare la proposta di avere una bug parade o una sezione di rompicapi informatici, questo entrerebbe di diritto...... High Flying Sottovento
__________________
In God we trust; all others bring data |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:33.



















