Domanda

Per il mio incarico Uni devo creare un ritmo veloce azione di gioco in rete e così hanno scelto di utilizzare UDP invece di TCP. Sono a conoscenza di molte delle differenze di programmazione sia UDP e TCP e di aver letto attraverso la maggior parte delle parti rilevanti della documentazione di MSDN su Winsock. Su MSDN afferma che la creazione di un socket UDP tramite la funzione connect () deve impegnare la presa di indirizzo e porta specificata e di conseguenza essere in grado di utilizzare send () e recv () funzioni con il socket creato.

Per la mia domanda ho creare un client e utilizzare connect () utilizzando l'indirizzo di loopback che invia un numero di pacchetti tramite la funzione send (). Il cliente, dopo aver chiamato select (), poi riceve i pacchetti da essa inviati. Tuttavia il risultato ottengo dal recv () è SOCKET_ERROR e la descrizione errore utilizzando WSAGetLastError () è "Una connessione esistente veniva chiusa forzatamente dall'host remoto".

Se io uso il bind () la funzione e l'uso sendto () per inviare dati tramite l'indirizzo di loopback, I recv () i pacchetti senza errori ... Qualcuno sa il motivo per cui la funzione connect () non sta facendo quello che è dovrebbe fare, e qualcuno ha potuto utilizzare i socket UDP con la funzione connect ()?

È stato utile?

Soluzione

Sarà necessario chiamare bind () se si desidera che il programma per ricevere i pacchetti UDP. connect () imposta solo l'indirizzo che la presa invierà pacchetti a se si chiama send (); non associa la presa con una porta UDP locale di ricevere via; per questo è necessario chiamare bind ().

Altri suggerimenti

"UNIX Network Programming", fa notare che una chiamata di connessione fatta su un socket UDP figure lato client e memorizza tutti lo stato circa l'indirizzo di destinazione presa in anticipo (mascheramento, interfaccia di selezione, ecc), risparmiando il costo di fare così su ogni :: chiamata sendto. Questo libro sostiene che :: send vs :: sendto può essere fino a 3x più veloce a causa di questa riduzione del carico - i dati possono andare direttamente al driver NIC bypassando la maggior parte di elaborazione stack IP. del programmatore di videogiochi ad alte prestazioni può prendere in considerazione questo.

Guida Beej alla rete di programmazione utilizzando Internet Sockets , ci sono dei bei esempi che riguardano la vostra domanda.

Tieni presente che il protocollo UDP è un " senza connessione " Protocollo di significato che mai e poi mai la connessione all'host, basta inviare fuori i dati. Così si può vedere che Connect come azione è priva di significato per UDP.

Per UDP si dovrebbe usare sendto () e recvfrom () in queste funzioni si specifica l'indirizzo e il buffer e che su di esso, tutto il resto che è comodamente gestito per voi in TCP è andato bisogna cose gestire da soli .

Nella documentazione MSDN sua ha detto che è possibile, infatti, in qualche modo utilizzare le normali funzioni di invio / RECV con UDP ma perché quando si ha già funzioni separate? Come altri hanno commentato già connect () per UDP fa qualcosa d'altro che non è essenzialmente un'operazione "Connect", ma una sorta di filtro per impostare send () / recv () per l'utilizzo di UDP.

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