PDA

Visualizza la versione completa : [c] Socket:funzione connect


and77
15-10-2010, 20:54
Salve,
ho scritto la seguente funzione che si appoggia su connect:



int connect_to_server(int *conn_fd,struct address_port addr_port){
int n; struct sockaddr_in serv_add;
memset((void*)&serv_add,0,sizeof(serv_add));
serv_add.sin_family=AF_INET;
serv_add.sin_port=htons(addr_port.port);
if( inet_pton(AF_INET,addr_port.addr,&serv_add.sin_addr) <= 0){
perror("inet_pton() error");
return -1;
}
if( (n=connect(*conn_fd,(struct sockaddr*)&serv_add,sizeof(serv_add))) < 0){
perror("connection error");
return -1;
}
return 0;
}

Quando ad un indirizzo non in ascolto nessun server la connect non ritorna.Come mai?Saluti.

simo_85
15-10-2010, 23:46
Originariamente inviato da and77
Quando ad un indirizzo non in ascolto nessun server la connect non ritorna.Come mai?Saluti.
Perch dovrebbe ritornare?


RETURN VALUES
Upon successful completion, a value of 0 is returned. Otherwise, a value
of -1 is returned and the global integer variable errno is set to indi-
cate the error.

and77
16-10-2010, 01:43
Non dovrebbe avvisarmi che a quell'indirizzo non c' alcun server in ascolto?Invece a me rimane bloccato nella funzione.

simo_85
16-10-2010, 07:05
Originariamente inviato da and77
Non dovrebbe avvisarmi che a quell'indirizzo non c' alcun server in ascolto?Si in effetti tramite la variabile errno:


Errors
...
ECONNREFUSED
No one listening on the remote address.
...
ENETUNREACH
Network is unreachable.
...
ETIMEDOUT
Timeout while attempting connection. The server may be too busy to accept new connections. Note that for IP sockets the timeout may be very long when syncookies are enabled on the server.

Comunque, hai provato a rivedere la condizione dell' if? Pu anche dipendere da quello.. Per esempio, io la connect l'ho sempre richiamata cos:


if((connect( ... , (struct sockaddr *)& ... , sizeof( ... ))) != -1)
printf("Ok connect\n");
else
{
perror ...
...
}
Ed ha sempre funzionato, se non ricordo male, con condizioni diverse toppava..

and77
16-10-2010, 10:00
Ho fatto varie prove ed ho notato che se l'indirizzo di tipo 192.168.1.n(cio se mi trovo all'interno della stessa rete) con relativa porta la funzione ritorna in caso in cui il server non in ascolto se invece l'indirizzo di tipo 192.169.1.n questa non ritorna segnalando l'errore.Come mai?

Loading