2009-03-24 19 views
15

Quiero crear un socket Winsock UDP que solo envíe datos a un cliente. Quiero que el núcleo elija un puerto disponible para mí. Por otro lado, quiero indicar qué IP local usar, ya que estoy ejecutando algunos nics.¿Cómo configurar un socket Winsock UDP?

He intentado peinar a través del laberinto de opciones de socket, así como vincular con el puerto en la dirección de socket establecida en 0 en vano.

Mi código es Win32 C++.

Respuesta

21

favor excusa la falta de comprobación de errores:

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

No es un "HowTo" directo, pero he estado usando una biblioteca de código abierto llamada "ACE (Adaptive Communication Environment) para toda mi programación de socket TCP y UDP y la encontré muy útil y poderosa. Se necesita un" software pattens "enfoque para proporcionar bloques de construcción para resolver su problema particular. Pude usar su encapsulación UDP para conectarme a un puerto determinado y enviar respuestas a un puerto libre elegido por el sistema. Alternativamente, puede especificar el puerto de retorno si lo desea . ACE está disponible aquí: ACE Homepage

-1

Cuando dices "Quiero indicar qué IP local usar, ya que estoy ejecutando algunos nics", ¿quieres decir que quieres especificar la dirección IP, o quieres especificar la nic y usar la dirección IP asociada?

Si está tratando de especificar la nic, this question debería ser relevante.

1

La respuesta de Graeme Perrow ya no funciona porque inet_addr está en desuso. Use inet_pton en su lugar como este:

#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; 
} 
Cuestiones relacionadas