|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Sto strippando...ancora socket su C...AIUTATEMI VI PREGO!
Sto lavorando in concorrenza e un server apre un listening socket in attesa di una connessione, poi i client (su altre macchine) tentano di connettersi. Il fatto e' che tutti i client credono di essersi connessi correttamente, pero' solo alcuni di essi lo sono veramente perche' dal lato server ne accetta 2 o 3 (variabile) su 4 che dovrebbe accettare...MA PERCHE'???
Il server al terzo o quarto client sembra quasi che non lo vede nemmeno, si ferma sull'accept e sta li' all'infinito, il client invece crede (non so perche') di essersi connesso correttamente e poi prova a comunicare e ovviamente non ci riesce...IDEE? Dimenticavo: lavoro in C sotto Linux SERVER: Codice:
int openListeningSocket(void)
{
struct sockaddr_in Local, Cli;
int socketfd, newsocketfd, OptVal, len, ris;
/* get a stream socket */
printf ("socket()\n");
socketfd=socket(AF_INET, SOCK_STREAM, 0);
if (socketfd==SOCKET_ERROR)
{
printf ("socket() failed, Err: %d \"%s\"\n", errno,strerror(errno));
exit(1);
}
/* avoid EADDRINUSE error on bind() */
OptVal=1;
printf ("setsockopt()\n");
ris=setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (char *)&OptVal, sizeof(OptVal));
if (ris==SOCKET_ERROR)
{
printf ("setsockopt() SO_REUSEADDR failed, Err: %d \"%s\"\n", errno,strerror(errno));
exit(1);
}
/* name the socket */
memset (&Local, 0, sizeof(Local));
Local.sin_family = AF_INET;
/* indicando INADDR_ANY viene collegato il socket all'indirizzo locale IP */
/* dell'interaccia di rete che verrÃ| utilizzata per inoltrare il datagram IP */
Local.sin_addr.s_addr = htonl(INADDR_ANY); /* wildcard */
Local.sin_port = htons(local_port_number);
printf ("bind()\n");
ris=bind(socketfd, (struct sockaddr*) &Local, sizeof(Local));
if (ris==SOCKET_ERROR)
{
printf ("bind() failed, Err: %d \"%s\"\n",errno,strerror(errno));
exit(1);
}
printf ("listen()\n");
ris=listen(socketfd, 100);
if (ris==SOCKET_ERROR)
{
printf ("listen() failed, Err: %d \"%s\"\n",errno,strerror(errno));
exit(1);
}
/* wait for connection request */
memset (&Cli, 0, sizeof(Cli));
len=sizeof(Cli);
printf ("accept()\n");
newsocketfd=accept(socketfd, (struct sockaddr*) &Cli, &len);
if (newsocketfd==SOCKET_ERROR)
{
printf ("accept() failed, Err: %d \"%s\"\n",errno,strerror(errno));
exit(1);
}
/* chiusura */
printf ("close()\n");
close(socketfd);
return(newsocketfd);
};
CLIENT: Codice:
int connectToSocket(char tcp[20], char port[20])
{
struct sockaddr_in Local, Serv;
char string_remote_ip_address[100];
short unsigned int remote_port_number;
int socketfd, OptVal, ris;
strncpy(string_remote_ip_address, tcp, 20);
remote_port_number = atoi(port);
/* get a datagram socket */
//printf ("socket()\n");
socketfd=socket(AF_INET, SOCK_STREAM, 0);
if (socketfd<0)
{
printf ("socket() failed, Err: %d \"%s\"\n", errno,strerror(errno));
return(-1);
}
/* avoid EADDRINUSE error on bind() */
OptVal=1;
//printf ("setsockopt()\n");
ris=setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (char *)&OptVal, sizeof(OptVal));
if (ris<0)
{
printf ("setsockopt() SO_REUSEADDR failed, Err: %d \"%s\"\n", errno,strerror(errno));
return(-1);
}
/* name the socket */
memset(&Local,0,sizeof(Local));
Local.sin_family = AF_INET;
/* indicando INADDR_ANY viene collegato il socket all'indirizzo locale IP */
/* dell'interfaccia di rete che verrÃ| utilizzata per inoltrare i dati */
Local.sin_addr.s_addr = htonl(INADDR_ANY); /* wildcard */
Local.sin_port = htons(0);
//printf ("bind()\n");
ris=bind(socketfd, (struct sockaddr*) &Local, sizeof(Local));
if (ris<0)
{
printf ("bind() failed, Err: %d \"%s\"\n",errno,strerror(errno));
return(-1);
//exit(1);
}
/* assign our destination address */
memset(&Serv, 0, sizeof(Serv));
Serv.sin_family = AF_INET;
Serv.sin_addr.s_addr =
inet_addr(string_remote_ip_address);
Serv.sin_port = htons(remote_port_number);
/* connection request */
//printf ("connect()\n");
ris=connect(socketfd, (struct sockaddr*) &Serv, sizeof(Serv));
if (ris<0)
{
printf ("connect() to %s:%d failed, Err: %d \"%s\"\n",string_remote_ip_address,remote_port_number,errno,strerror(errno));
return(-1);
}
return(socketfd);
};
__________________
Il mio case prima della "cura" --> Il mio case...dopo! .oO (Firefox Myths) Myths Oo. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perchè il socket in ascolto non lo lasci aperto invece di chiuderlo ad ogni connessione che fai ? Non è questo il metodo corretto di operare...
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
__________________
Il mio case prima della "cura" --> Il mio case...dopo! .oO (Firefox Myths) Myths Oo. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:48.



















