Domanda

Quando un server accetta un client tramite una connessione TCP / IP, viene creato un nuovo socket.

E 'sicuro utilizzare la porta LocalEndPoint (dal punto di vista del cliente) come id? Esempio (dal punto di vista del server):

int clientId = ((IPEndPoint)client.RemoteEndPoint).Port;

Sulla mia macchina locale, la porta sembra essere unico, ma con più client su macchine diverse, non può essere sempre il caso.

La mia seconda domanda: Diciamo che la porta non può essere utilizzato come un ID univoco, come il server (e quindi lo stack di protocollo) può distinguere tra due socket client (dal punto di vista del server).

TY.

È stato utile?

Soluzione

L'unicità di uno zoccolo è identificata da 4 valori:. (IP locale, porte locali, IP remoto, porta remota) ed è così che gli stack di protocollo identificano una connessione

Detto questo, si può avere più connessioni dallo stesso numero di porta per lo stesso numero di porta, ma per esempio ad un indirizzo remoto diverso. In genere è necessario richiedere specificamente autorizzazioni per utilizzare la stessa porta locale per più di 1 connessione in uscita.

Il vostro esempio int clientId = ((IPEndPoint) client.RemoteEndPoint) .PORTE; non utilizza la porta locale, ma la porta sul lato remoto. Questo non è certamente unico, come diversi clienti potrebbe accadere a scegliere la stessa porta. La porta del server è probabilmente fisso, e sarà sempre lo stesso per tutte le connessioni. Pertanto, se si desidera qualcosa di unico sul lato server, è necessario utilizzare i 4 valori di cui sopra.

Tuttavia, se avete solo bisogno di un identificativo univoco all'interno della propria applicazione client tra le connessioni che hai impostato su voi stessi, la porta locale farà.

Altri suggerimenti

Non utilizzare il punto finale a distanza - creare un GUID -. Per ogni connessione (accettato)

Far passare il GUID indietro al client socket - ottenere il client per salvarla (molto meglio di una sessione HTTP) e aggiungere il GUID per eventuali successive intestazioni HTTP diretto a voi:)

allora !! la necessità perfetto per un HastTable <> !!! solo un paio di situazioni che conosco!

Perché non usare "cliente" come identificatore univoco. Un identificativo univoco non deve essere di un tipo di valore.

La risposta breve alla prima domanda è probabilmente no. Il sistema operativo client di solito sceglie una porta da un intervallo. Anche se tale intervallo è 40-50 mila grande, se il server è occupato abbastanza, prima o poi, si può avere la stessa porta che arriva da diversi clienti. Se non è un server occupato potresti essere fortunato.

Sockets si differenziano tra loro basato su coppie di indirizzo / porta / protocollo. L'insieme combinato di questi valori dal client e il server sarà unico.

Perché non si può semplicemente utilizzare l'indirizzo del client e la porta come un ID temporaneo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top