VB [GUIDA] Connettere il client al server con i sockets in vb.net

Stato
Discussione chiusa ad ulteriori risposte.
Ultima modifica:
No, quello lo so fare, intendo x chi apre una chat che fa da server senza aprire la porta.. vedo su google port map...


non trovo nulla con google o.o
 
la porta la scegli tu....
SE hai letto il sorgente (ma penso hai fatto un rapido copia incolla) dovresti aver notato questo
Codice:
servitore = New TcpListener(8888) 'servitore è un nuovo server che riceve/invia dati su porta 8888
 
Si, certo che ho letto!!!
E ho capito tutto, di quello a connessione normale, comunque anche se cambio la porta, se essa non è aperta, il programma non funge...
 
Certo che ho un firewall .-.
Quindi mi attacco in pratica...
Pero' se uso una porta che ho aperto dal router funge...
Peccato che il progetto sia inutile cosi'...
 
Certo che ho un firewall .-.
Quindi mi attacco in pratica...
Pero' se uso una porta che ho aperto dal router funge...
Peccato che il progetto sia inutile cosi'...
ammetto che la tentazione di puntarti un laser addosso ed incenerirti e forte.
Un firewall è ovviamente configurabile, pertanto è sufficente che dici al firewall (qualunque esso sia) di aprire quella determinata porta.
 
Comunque portmap è difficile da trovare. Se ti serve te lo passo.
E poi perchè dovrebbe essere inutile così?
Tanto solo il server ha bisogno di aprire la porta, mica i client. Quindi basta che l'amministratore del server la aprà e poi tutti possono connettersi.
Non è possibile far connettere un server senza aprire la porta che il server utilizza (è un'azione NECESSARIA).
OT:
Teck se ci sei entra su Skype
 
SpeedJack il suo problema attuale è il firewall software, che non gli permette di connettersi su localhost, non ha ancora bisogno di aprire le porte nel router per provare con amici esterni. Gli basta aprire la porta per vederlo funzionare.
 
SpeedJack il suo problema attuale è il firewall software, che non gli permette di connettersi su localhost, non ha ancora bisogno di aprire le porte nel router per provare con amici esterni. Gli basta aprire la porta per vederlo funzionare.

Da questa frase avevo capito diversamente:
intendo x chi apre una chat che fa da server senza aprire la porta..
Se è il firewall allora hai già spiegato tutto te ;-)
 
Nono, ha ragione speed, comunque sono riuscito quasi a risolvere, anche se il portmap sarebbe meglio...
non mi pare una bella idea disabilitare il firewall...
 
Ultima modifica:
Salve, sono giunto in questo forum/comunità utilizzando un motore di ricerca. Mi sono presentato qui.

Mi scuso a priori se esordisco chiedendo delle informazioni su un thread non attivo da un paio di mesi.
Sto realizzando un programma simile a quello di questo thread unendo in un'unica soluzione un client/server che utilizza il protocollo DCC (in breve è un protocollo di comunicazione diretto, da uno-ad-uno che prevede un handshake iniziale che dichiara il tipo di comunicazione - se chat o trasferimento file, utilizzato principalmente da client IRC per sopperire ad alcune mancanze intrinsiche del protocollo di quest'ultimo).
Sto cercando di "intercettare" l'evento di chiusura dello socket da parte dell'host remoto: cosa che però mi risulta impossibile - da quanto ho letto in rete la dichiarazione Connected di TcpClient diventa true al momento della connessione dello socket e non viene mai dichiarata false quando la connessione viene interrotta. Sono conscio di poter intercettare l'evento di disconnessione implementando una soluzione di tipo PING (insomma inviare un pacchetto qualsiasi per verificare lo stato di connessione dello socket) tuttavia vorrei evitare questa soluzione in quanto non contemplata dal protocollo DCC.

Idee? :)

Edit: dimenticavo di ringraziare SpeedJack per l'ottima guida e NiktorTheNat per la versione video della stessa, mi sono stati entrambi preziosamente utili per il mio piccolo programmino. Appena scopro come si fa il "+1" non mancherò di farlo :P
 
Ultima modifica:
Ora non ho molto tempo, domani guardo.
Comunque un'altra soluzione è far si che prima della chiusura, il client invii il messaggio al server che si sta disconnettendo, ovviamente così non funzionerebbe se il pc con il client viene staccato manualmente dalla rete internet o perde la connessione. Quindi forse il migliore è il metodo del ping.
Domani do' un'occhiata in giro e ti faccio risapere cosa trovo ;)
Intanto prova a dare un'occhiata su MSDN:
MSDN - Namespace System.Net.Sockets
Comunque non ti preoccupare se questo thread non è attivo. è in rilievo, e il necroposting non esiste in questo tipo di discussioni.
Per dare un +1 devi prima di tutto essere utente attivo (registrato da 1 settimana e con almeno 50 messaggi) e poi devi cliccare sull'asterisco in basso a sinistra di un messaggio (vicino si trova un triangolo con il punto esclamativo, il tasto segnala).
Ora scappo ciao ;)
 
se non ricordo male il DCC si appoggia sul TCP. i socket tcp comunicano quando la connessione è stata interrotta (come ottenere questa informazione dipende da linguaggio)
 
Ultima modifica:
Comunque un'altra soluzione è far si che prima della chiusura, il client invii il messaggio al server che si sta disconnettendo, ovviamente così non funzionerebbe se il pc con il client viene staccato manualmente dalla rete internet o perde la connessione.
Si è una possibile soluzione - tuttavia oltre a non prevedere la disconnessione accidentale nel mio specifico caso non mi farebbe rispettare il protocollo.
Ho visto il tuo link, ero già arrivato a questa pagina che tratta lo stesso argomento in maniera diversa e localizzata nella nostra lingua dove viene per l'appunto confermato che la proprietà Connected cito testualmente: "indica se un Socket si è connesso a un host remoto dall'ultima operazione Send o Receive".
Da quanto leggo lì quindi concordo sul fatto che la soluzione PING resti la soluzione più "elegante" benchè mi sembri oltremodo strano che il framework non permetta di catturare l'evento della disconnessione di uno socket.

Comunque non ti preoccupare se questo thread non è attivo. è in rilievo, e il necroposting non esiste in questo tipo di discussioni.
Spero quindi questa discussione possa dare un valore aggiunto a chi vuole cimentarsi in quest'impresa :)

se non ricordo male il DCC si appoggia sul TCP. i socket tcp comunicano quando la connessione è stata interrotta (come ottenere questa informazione dipende da linguaggio)
Esattamente, TCP si occupa di controllare l'integrità dei pacchetti: è un metodo di trasferimento più lento rispetto ad UDP che non fa questo controllo però nettamente più affidabile visto che lo scopo del protocollo DCC è scambiare informazioni testuali e file. Suppongo la documentazione presente su MSDN sia realizzata male perchè - torno a ripetere - mi sembra altamente improbabile che non sia possibile catturare l'evento senza necessariamente ricorrere ad una soluzione di tipo PING.


Edit: ho risolto usando l'istruzione Poll (nella sua proprietà SelectMode.SelectRead si occupa di controllare se lo socket è disponibile in lettura, se non lo è vuol dire che lo socket è disconnesso):
Codice:
If cliente.Client.Poll(1, SelectMode.SelectRead) Then
    'Socket disconnesso
    Else
    'Socket connesso
End If
 
comunque per quello che so io, in c, se io faccio una recv o una send ed il socket è disconnesso, mi restituisce 0.... credo che anche in questo caso succeda una cosa simILE (forse con un'eccezione)
 
Ultima modifica:
comunque per quello che so io, in c, se io faccio una recv o una send ed il socket è disconnesso, mi restituisce 0.... credo che anche in questo caso succeda una cosa simILE (forse con un'eccezione)
Si, "fare una send" è quello che intedevo con metodo PING :D

Edit: probabilmente il nome che ho scelto non è dei più felici in quanto suppongo esclusivamente irc-related.
Per controllare che la tua connessione sia attiva e funzionante, il server IRC può inviare un tipo di segnale, chiamato PING. Se sei attivo, il tuo client IRC risponderà automaticamente al PING del server con un PONG, se il server non riceverà risposta entro un tempo accettabile, verrai disconnesso dal server.
Fonte (in inglese, traduzione non fedele all'originale per renderla più chiara).
 
Edit: ho risolto usando l'istruzione Poll (nella sua proprietà SelectMode.SelectRead si occupa di controllare se lo socket è disponibile in lettura, se non lo è vuol dire che lo socket è disconnesso):
Il codice da me postato in precedenza non è propriamente corretto, lo avevo inserito in un timer di 1 secondo e funzionava fintantochè dall'altra parte della connessione non veniva inviato nulla nello stesso momento in cui l'istruzione veniva verificata. In altre parole se lo socket era in lettura era occupato e quindi non disponibile in lettura (sono un principiante e questa spiegazione benchè apparentemente logica non so se è corretta, quindi non prendete ciò che dico per oro colato). Ad ogni modo qui di seguito il codice corretto:
Codice:
If cliente.Client.Poll(1, SelectMode.SelectRead) And (cliente.Client.Available = 0) Then
    'Istruzioni da eseguire se lo socket è disconnesso.
    Else
    'Istruzioni da eseguire se lo socket è connesso.
End If
 
Stato
Discussione chiusa ad ulteriori risposte.
Indietro
Top Bottom