problema di connessione con socket TCP
Re: problema di connessione con socket TCP
si nelo stesso file ho un if ke mi permette di scegliere qutomaticamente quale utente sono....
Re: problema di connessione con socket TCP
non rieso proprio ad uscirne
Re: problema di connessione con socket TCP
Penso di aver capito il problema...quando puoi mandami il file sorgente al mio indirizzo email e poi ti rispondo qui sul forum 
Re: problema di connessione con socket TCP
ok scusa non volevo essere invadente!!!
Re: problema di connessione con socket TCP
te l'ho appena mandata!
Re: problema di connessione con socket TCP
Allora caro amico mio, partiamo dal presupposto che usare connect() su di una socket "inesistente" perchè non ancora "aggangiata" attraverso il bind() (vedi la nota [1] sul codice) è qualcosa di assolutamente scorretto quindi ti consiglio di trovare un altro modo per discriminare quale utente sia attivo 
Partiamo con il debug...
UTENTE 1 ---
Creo le tre socket, provo a connettermi alla prima (porta 5000), ovviamente non ci riesco perchè non c'è nessuno in ascolto ed entro nel primo if.
Mi metto in ascolto sulle porte 5000 e 5002 facendo il bind() e aspetto.
UTENTE 2 ---
Creo le tre socket, stavolta c'è qualcuno in ascolto sulla porta 5000 e quindi non entro nel primo if.
Entro nel ramo else if perchè non c'è ancora nessuno in ascolto sulla porta 5001.
Mi metto in ascolto sulla porta 5001 facendo il bind() e aspetto.
INTANTO -> Utente1 si accorge che qualcuno si è connesso sulla porta 5000 e lo notifica.
UTENTE 3 ---
Creo le tre socket.
A questo punto occorre una precisazione: il secondo argomento del "metodo" listen() (vedi nota [2]) è un intero che sta ad indicare il numero massimo orientativo di connessioni pendenti che possono essere tenute in piedi dal kernel in attesa che il programma le serva, NON quanti client possono connettersi su quella porta attraverso una socket. Se questo numero fosse zero, Utente3 entrerebbe nel primo if identificandosi come Utente1! (sempre ammesso che il kernel "accetti" zero come argomento)
Nel tuo caso Utente3 riesce a connettersi alla porta 5000 (if) pur restando in attesa e alla porta 5001 (else if) perchè libera. Entro nel ramo else.
Provo a connettermi di nuovo alla porta 5001 usando lo stesso descrittore di socket (con5k1_s) utilizzato poco sopra nel controllo else if e a questo punto esco stampando quell'errore. (vedi nota [3])
INTANTO -> Utente1 si accorge che qualcuno si è connesso sulla porta 5002 e lo notifica. Utente2 si accorge che qualcuno si è connesso sulla porta 5001 e lo notifica.
Mistero risolto
Buon lavoro 
PS Dai dei nomi più significativi cosi magari capisci, e fai capire, anche meglio cosa scrivi :P
PPS Il codice a cui faccio riferimento te l'ho mandato per posta perchè non sapevo se potevo pubblicarlo nonostante i tagli
Partiamo con il debug...
UTENTE 1 ---
Creo le tre socket, provo a connettermi alla prima (porta 5000), ovviamente non ci riesco perchè non c'è nessuno in ascolto ed entro nel primo if.
Mi metto in ascolto sulle porte 5000 e 5002 facendo il bind() e aspetto.
UTENTE 2 ---
Creo le tre socket, stavolta c'è qualcuno in ascolto sulla porta 5000 e quindi non entro nel primo if.
Entro nel ramo else if perchè non c'è ancora nessuno in ascolto sulla porta 5001.
Mi metto in ascolto sulla porta 5001 facendo il bind() e aspetto.
INTANTO -> Utente1 si accorge che qualcuno si è connesso sulla porta 5000 e lo notifica.
UTENTE 3 ---
Creo le tre socket.
A questo punto occorre una precisazione: il secondo argomento del "metodo" listen() (vedi nota [2]) è un intero che sta ad indicare il numero massimo orientativo di connessioni pendenti che possono essere tenute in piedi dal kernel in attesa che il programma le serva, NON quanti client possono connettersi su quella porta attraverso una socket. Se questo numero fosse zero, Utente3 entrerebbe nel primo if identificandosi come Utente1! (sempre ammesso che il kernel "accetti" zero come argomento)
Nel tuo caso Utente3 riesce a connettersi alla porta 5000 (if) pur restando in attesa e alla porta 5001 (else if) perchè libera. Entro nel ramo else.
Provo a connettermi di nuovo alla porta 5001 usando lo stesso descrittore di socket (con5k1_s) utilizzato poco sopra nel controllo else if e a questo punto esco stampando quell'errore. (vedi nota [3])
INTANTO -> Utente1 si accorge che qualcuno si è connesso sulla porta 5002 e lo notifica. Utente2 si accorge che qualcuno si è connesso sulla porta 5001 e lo notifica.
Mistero risolto
PS Dai dei nomi più significativi cosi magari capisci, e fai capire, anche meglio cosa scrivi :P
PPS Il codice a cui faccio riferimento te l'ho mandato per posta perchè non sapevo se potevo pubblicarlo nonostante i tagli
Re: problema di connessione con socket TCP
grazie mille..
e scusa il ritardo!!!
e scusa il ritardo!!!
Re: problema di connessione con socket TCP
Nessun problema
spero di esserti stato d'aiuto 
Re: problema di connessione con socket TCP
scusami il ritardo ma avevo da fare(esami),cmq non ho ancora risolto quel problema..ma credo ke cambiero radicalmente il codice,cmq il connect si puo fare anche senza il bind,dato che l'associazione della socket al servizio e intrinseca nel comando,infatti passi socket e servizio!!!
Re: problema di connessione con socket TCP
Si ok ma io intendevo che fare connect() prima di bind() significa far fallire sicuramente la system call (connect) ed io personalmente non vedo che senso abbia lanciare un system call che sicuramente fallirà 
Re: problema di connessione con socket TCP
no..perche???in fondo credo che il connect cerchi una porta ke e messa in listen!!!lpoi se la porta c'e....bene, altrimenti non va a buon fine...secondo me sono due cose distinte...logico che il connect vada a buon fine se prima c'e stato un bind(serve appunto qualcuno che ascolti)..ma il connect si puo lanciare lo stesso,la procedura e corretta..ma ke poi non vada a buon fine e un'altro discorso!!!
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti
