problema di connessione con socket TCP

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

problema di connessione con socket TCP

Messaggio da 4other »

ciao a tutti ho un problema con le socket TCP,io sto cercando di creare una chat client-client,tra 3 utenti,che sono di fatto 3 processi,l'errore e questo;
Transport endpoint is already connected
mentre la dimanmica è:
il primo processo si mette in ascolto su due porte differenti(P1P3),il secondo processo si connette con il primo tramite P1 e si mette in ascolto con la porta P2,il terzo ed ultimo processo si connette con il primo tramite P3 e si(dovrebbe) connnettere con il secondo attraverso P2,il problema e che la connessioni al primo utente avviene senza problemi mentre invece la connessio da parte del terso verso il secondo mi genera quall'errore,il problema e che la connessione viene accettata da parte del secondo solo che il terzo utente mi dice:
Transport endpoint is already connected
non riesco a capire il perche!!!
Allegati
mio.jpg
Ultima modifica di 4other il martedì 26 agosto 2008, 10:19, modificato 1 volta in totale.
Avatar utente
pieddu
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 13453
Iscrizione: sabato 11 novembre 2006, 21:46
Desktop: Mate XFCE
Distribuzione: Devuan Trisquel
Sesso: Maschile
Località: Serravalle di Chienti (Taverne)

Re: problemadi connessione con socket TCP

Messaggio da pieddu »

Prova a vedere con netstat se succede quello che dovrebbe succedere....

Codice: Seleziona tutto

netstat -lutanp
:birra:
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problemadi connessione con socket TCP

Messaggio da Balim »

Non appena il secondo processo inizia a comunicare sulla socket, immagino attraverso una connect() a P1, si "fossilizza" su quella e se ne frega altamente del terzo processo che tenta di connettersi su P2. Lui è già in comunicazione con qualcuno e se due "parlano" insieme non si capisce nulla! ;) Prova a chiudere la comunicazione con il primo processo e non dovrebbe più darti problemi.
Per fare quello che vuoi tu dovresti creare un altro thread dal secondo processo per gestire il socket in ascolto su P2
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problemadi connessione con socket TCP

Messaggio da 4other »

si esatto mi connetto con il "connect" e "accept" dall'altra parte,ma se chiudo la comunicazioni con un "close" sulla socket,ogni volta che un utente deve mandare il msg devo rifare la fase di handshake...
percio potrebbe funzionare se creo il processo figlio("fork") ke mi gestisce la seconda connessione sull'utente 2!??
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problemadi connessione con socket TCP

Messaggio da 4other »

infatti io ascolto sull'utente 2 con un fork!!!questo e parte del codice dell'utente 2:

Codice: Seleziona tutto

if((lst5k1_s=socket(AF_INET,SOCK_STREAM,0))<0) {printf("NO lst5k1_S\n");return -1;}
	 lst5k1.sin_family = AF_INET; 
	 lst5k1.sin_addr.s_addr = htonl(INADDR_ANY);
	 lst5k1.sin_port = htons(PORT2);
 	 if ((bind(lst5k1_s, (struct sockaddr *) &lst5k1, sizeof(lst5k1)))<0) 
 		 {printf("no bind lst5k1_s\n");return -1;}
 	 
 	 if ((pid=fork())==0)
 	 	{//sono nel figlio
 	 	listen(lst5k1_s,1);
 	 	//accept 5001
 	 	if ((com5k1_s=accept(lst5k1_s, (struct sockaddr *)&com5k1, &address_size))<0)
 	 		{perror("NO accept com5k1\n"); return;}
 	 	else	printf("com5k1 accettata \n");
 	  	 
ma quello ke mi sembra strano è  che il processo2 non rifiuta la cnnessione!!!l'accept va a aboun fine..è sul terminale del proceso3 che mi esce il problema..
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problemadi connessione con socket TCP

Messaggio da Balim »

4other ha scritto: infatti io ascolto sull'utente 2 con un fork!!!questo e parte del codice dell'utente 2:

Codice: Seleziona tutto

if((lst5k1_s=socket(AF_INET,SOCK_STREAM,0))<0) {printf("NO lst5k1_S\n");return -1;}
	 lst5k1.sin_family = AF_INET; 
	 lst5k1.sin_addr.s_addr = htonl(INADDR_ANY);
	 lst5k1.sin_port = htons(PORT2);
 	 if ((bind(lst5k1_s, (struct sockaddr *) &lst5k1, sizeof(lst5k1)))<0) 
 		 {printf("no bind lst5k1_s\n");return -1;}
 	 
 	 if (fork() == 0) //mi sembra più corretto
 	 	{//sono nel figlio
 	 	listen(lst5k1_s,1);
 	 	//accept 5001
 	 	if ((com5k1_s=accept(lst5k1_s, (struct sockaddr *)&com5k1, &address_size))<0)
 	 		{perror("NO accept com5k1\n"); return;}
 	 	else	printf("com5k1 accettata \n");
 	  	 
ma quello ke mi sembra strano è  che il processo2 non rifiuta la cnnessione!!!l'accept va a aboun fine..è sul terminale del proceso3 che mi esce il problema..
Quello che vedo mi sembra fatto bene, però siccome si tratta di un processo "ibrido" che funge sia da server che da client (mentre utente1 è solo server e utente3 solo client) per capire il problema è più utile vedere tutto il codice di utente2 ;)

PS. Ho fatto una piccola modifica alla chiamata fork()
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problemadi connessione con socket TCP

Messaggio da 4other »

ho appena iniziato questo progetto,per adesso il mio primo step è farli connettere..poi farli comunicare,adesso ti scrivo solo il processo 2,tanto come hai detto tu nel primo sono 2 "listen" e nel terzo sono due "connect",

Codice: Seleziona tutto

if ((connect(con5k1_s, (struct sockaddr *)&con5k1, sizeof(con5k1)))<0)
	 {
	 /*sono l'utente 2*/
	 printf("sono l'utente 2\n");
	 /*
	 mettermi in  acscolto 5001*/
	 if((lst5k1_s=socket(AF_INET,SOCK_STREAM,0))<0) {printf("NO lst5k1_S\n");return -1;}
	 lst5k1.sin_family = AF_INET; 
	 lst5k1.sin_addr.s_addr = htonl(INADDR_ANY);
	 lst5k1.sin_port = htons(PORT2);
 	 if ((bind(lst5k1_s, (struct sockaddr *) &lst5k1, sizeof(lst5k1)))<0) 
 		 {printf("no bind lst5k1_s\n");return -1;}
 	 
 	 if ((pid=fork())==0)
 	 	{//sono nel figlio
 	 	listen(lst5k1_s,1);
 	 	//accept 5001
 	 	if ((com5k1_s=accept(lst5k1_s, (struct sockaddr *)&com5k1, &address_size))<0)
 	 		{perror("NO accept com5k1\n"); return;}
 	 	else	printf("com5k1 accettata \n");
 	 
 	 	}
	 for(;;);/*creare il ciclo che legge le socket in ingresso(5000,5001), plotta legge il terminale e manda
	 */
	 }
cioe per adesso sono ancora nella fase di connessione,ho gia pronta la fase di comunicizaione...ma insomma..un passo alla volta :-)
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problemadi connessione con socket TCP

Messaggio da 4other »

opppsss.l'ho vista adesso la modifica dalla fork..ma tengo il pid perche potrebbe essere che mi interessi l'ID del processo
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problemadi connessione con socket TCP

Messaggio da Balim »

SE riesco a connettermi con la porta 5000 (utente1) ALLORA creo una socket sulla porta 5001 per far connettere utente3?
Il ramo

Codice: Seleziona tutto

else	printf("com5k1 accettata \n");
viene eseguito?
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problemadi connessione con socket TCP

Messaggio da 4other »

si è quello ke mi fa imbestialire...l'utente1 accetta senza problemi la connessione ma anche l'utente2 accetta la connessione,è l'utente3 che mi plotta:
Transport endpoint is already connected
infatti e quello ke mi sembra strano..
utente1
connessione 5000 e 5002
utente2
connessione 5000 effettuata
connessione 5001 accettata
utente3
connessione 5002  effettuata
errore 5001: tasport......
questo e  quello ke mi plottano i terminali dei vari utenti
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problemadi connessione con socket TCP

Messaggio da Balim »

Mi fai vedere il codice degli altri due processi...
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problemadi connessione con socket TCP

Messaggio da 4other »

questo e il terzo

Codice: Seleziona tutto

/*sono l'utente 3*/
	 printf("sono l'utente 3\n");
	 /*mandare connect a 5001 e 5002*/
	 if ((connect (con5k1_s, (struct sockaddr *)&con5k1, sizeof(con5k1)))<0) 
	 {
	 printf("no connect 5001\n");
	 printf("error 5001: %s\n",strerror(errno));
	 }
 
	 if ((connect (con5k2_s, (struct sockaddr *)&con5k2, sizeof(con5k2)))<0) 
	 {
	 printf("no connect 5002\n");
	 printf("error 5002: %s\n",strerror(errno));
	 }
	 
	 for(;;);/*creare i cicli x leggere socket(5001,5002), plotta e legge dal teminale e broadcast
poi c'e il primo ma il primo non dda problemi...non e che non mi fidi ma vorrei evitare di mettere tutto il codice in rete
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problemadi connessione con socket TCP

Messaggio da Balim »

Figurati ;)
L'unica cosa che mi viene in mente è far gestire totalmente la "sezione" server dal processo figlio spostando in alto la chiamata fork(). Vedi se migliora qualcosa...

Codice: Seleziona tutto

if ((connect(con5k1_s, (struct sockaddr *)&con5k1, sizeof(con5k1)))<0)
	 {
	 /*sono l'utente 2*/
	 printf("sono l'utente 2\n");
	 if ((pid=fork())==0) //processo figlio
 	 	{/*mettermi in  acscolto 5001*/
	         if((lst5k1_s=socket(AF_INET,SOCK_STREAM,0))<0) {printf("NO lst5k1_S\n");return -1;}
	         lst5k1.sin_family = AF_INET; 
	         lst5k1.sin_addr.s_addr = htonl(INADDR_ANY);
	         lst5k1.sin_port = htons(PORT2);
 	         if ((bind(lst5k1_s, (struct sockaddr *) &lst5k1, sizeof(lst5k1)))<0) 
 		 {printf("no bind lst5k1_s\n");return -1;}
 	         listen(lst5k1_s,1);
 	 	//accept 5001
 	 	if ((com5k1_s=accept(lst5k1_s, (struct sockaddr *)&com5k1, &address_size))<0)
 	 		{perror("NO accept com5k1\n"); return;}
 	 	else	printf("com5k1 accettata \n");
 	 
 	 	}
	 for(;;);/*creare il ciclo che legge le socket in ingresso(5000,5001), plotta legge il terminale e manda
	 */
	 }
In questo caso ti conviene creare un procedura di servizio per gestire la comunicazione se non vuoi duplicare il ciclo for ;)
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problema di connessione con socket TCP

Messaggio da 4other »

creare un procedura di servizio per gestire la comunicazione se non vuoi duplicare il ciclo for
in che senso?
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problema di connessione con socket TCP

Messaggio da 4other »

cmq ho provato e...stesso problema... >:( >:(
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problema di connessione con socket TCP

Messaggio da Balim »

Per esempio:

Codice: Seleziona tutto

int servizio(int sck)
{
    for(;;); //gestisco la comunicazione
    return 0;
}

...

if ((connect(con5k1_s, (struct sockaddr *)&con5k1, sizeof(con5k1)))<0)
	 {
	 /*sono l'utente 2*/
	 printf("sono l'utente 2\n");
         if ((pid=fork())==0) //processo figlio
 	 {/*mettermi in  acscolto 5001*/
	         if((lst5k1_s=socket(AF_INET,SOCK_STREAM,0))<0) {printf("NO lst5k1_S\n");return -1;}
	         lst5k1.sin_family = AF_INET; 
	         lst5k1.sin_addr.s_addr = htonl(INADDR_ANY);
	         lst5k1.sin_port = htons(PORT2);
 	         if ((bind(lst5k1_s, (struct sockaddr *) &lst5k1, sizeof(lst5k1)))<0) 
 		 {printf("no bind lst5k1_s\n");return -1;}
 	         listen(lst5k1_s,1);
 	 	//accept 5001
 	 	if ((com5k1_s=accept(lst5k1_s, (struct sockaddr *)&com5k1, &address_size))<0)
 	 		{perror("NO accept com5k1\n"); return;}
 	 	else	printf("com5k1 accettata \n");
 	 
 	 	servizio(com5k1_s); //NOTA
        }

	 servizio(con5k1_s);//NOTA

4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problema di connessione con socket TCP

Messaggio da 4other »

ah ok si...ho capito..infatti avevo pensato di fare cosi..cosi anche per gli altri utenti mi fastava una chiamata ad un metodo...cmq quel cxxo di problema non e ancora sparito..
ma non e che per caso sia una specie di warning???una specie di avvertimento???perche non mi psiego come mai ho "accept" corretto all'utente 2(che tra l'altro l'accept mi crea una socket ke mi collega al processo ke richiede il "connect")ma "connect" errato..e come se l'utente 2 accettasse e poi mandasse il msg di errore cosi ke il connect dell'utente3 non va  a buon fine!
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problema di connessione con socket TCP

Messaggio da Balim »

Prova questa modifica...

Codice: Seleziona tutto

if ((bind(lst5k1_s, &lst5k1, sizeof(lst5k1)))<0) 
Dovrebbe darti un warning in compilazione ma tu ignoralo pure :P
4other
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 421
Iscrizione: venerdì 12 ottobre 2007, 9:01

Re: problema di connessione con socket TCP

Messaggio da 4other »

e venuto fuori il warning ma quando lo vado ad eseguire non c'e verso...sempre il solito problema...senti tagliamo la testa al toro..ti mando il listato su msn....
Avatar utente
Balim
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 288
Iscrizione: martedì 19 febbraio 2008, 17:50

Re: problema di connessione con socket TCP

Messaggio da Balim »

4other ha scritto: ah ok si...ho capito..infatti avevo pensato di fare cosi..cosi anche per gli altri utenti mi fastava una chiamata ad un metodo...cmq quel cxxo di problema non e ancora sparito..
Da questa frase io capisco che tu stai usando un solo file sorgente al cui interno vuoi gestire tutti e tre gli utenti... Indovinato?
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti