2009-03-24 17 views
15

Desidero creare un socket UDP Winsock che invii solo dati a un client. Voglio che il kernel scelga una porta disponibile per me. D'altra parte, voglio indicare quale IP locale usare, dal momento che sto eseguendo un po 'di nics.Come impostare un socket UDP Winsock?

Ho provato a sfogliare il labirinto delle opzioni di socket, oltre a legare con la porta nell'indirizzo del socket impostato su 0.

Il mio codice è in Win32 C++.

risposta

21

Chiedo scusa per la mancanza di controllo degli errori:

char pkt[...]; 
size_t pkt_length = ...; 
sockaddr_in dest; 
sockaddr_in local; 
WSAData data; 
WSAStartup(MAKEWORD(2, 2), &data); 

local.sin_family = AF_INET; 
local.sin_addr.s_addr = inet_addr(<source IP address>); 
local.sin_port = 0; // choose any 

dest.sin_family = AF_INET; 
dest.sin_addr.s_addr = inet_addr(<destination IP address>); 
dest.sin_port = htons(<destination port number>); 

// create the socket 
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
// bind to the local address 
bind(s, (sockaddr *)&local, sizeof(local)); 
// send the pkt 
int ret = sendto(s, pkt, pkt_length, 0, (sockaddr *)&dest, sizeof(dest)); 
-1

Non un "HowTo" diretto, ma ho utilizzato una libreria open source denominata "ACE (Adaptive Communication Environment") per tutti i miei socket TCP e UDP e l'ho trovata molto utile e potente. "approccio alla fornitura di elementi costitutivi per risolvere il tuo particolare problema Sono stato in grado di utilizzare l'incapsulamento UDP per connettersi a una determinata porta e avere risposte inviate a una porta libera scelta dal sistema.In alternativa puoi specificare la porta di ritorno se desideri . ACE è disponibile qui: ACE Homepage

-1

Quando si dice "Voglio indicare quale IP locale utilizzare, dal momento che sto eseguendo un po 'di nics", vuoi dire che vuoi specificare l'indirizzo IP, o vuoi specificare il nic e utilizzare l'indirizzo IP associato?

Se si sta tentando di specificare il numero, this question dovrebbe essere rilevante.

1

La risposta di Graeme Perrow non funziona più perché inet_addr è deprecato. Usa inet_pton invece:

#include <string> 
#include <WinSock2.h> 
#include <Ws2tcpip.h> 

#pragma comment(lib, "ws2_32.lib") 
using namespace std; 

int main() { 
    const char* pkt = "Message to be sent"; 
    const char* srcIP = < source IP address >; 
    const char* destIP = < destination IP address >; 
    sockaddr_in dest; 
    sockaddr_in local; 
    WSAData data; 
    WSAStartup(MAKEWORD(2, 2), &data); 
    ULONG* srcAddr = new ULONG; 
    ULONG* destAddr = new ULONG; 

    local.sin_family = AF_INET; 
    inet_pton(AF_INET, srcIP, srcAddr); 
    local.sin_addr.s_addr = *srcAddr; 
    local.sin_port = htons(0); 

    dest.sin_family = AF_INET; 
    inet_pton(AF_INET, destIP, destAddr); 
    dest.sin_addr.s_addr = *destAddr; 
    dest.sin_port = htons(< destination port number >); 

    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    bind(s, (sockaddr *)&local, sizeof(local)); 

    sendto(s, pkt, strlen(pkt), 0, (sockaddr *)&dest, sizeof(dest)); 

    delete srcAddr; 
    delete destAddr; 

    return 0; 
} 
Problemi correlati