Domanda

Voglio creare un socket UDP Winsock che invia solo i dati a un client. Voglio che il kernel di scegliere una porta disponibile per me. D'altra parte, voglio indicare quali IP locale da utilizzare, dal momento che sto correndo un paio di schede di rete.

Ho provato pettinatura attraverso il labirinto di opzioni socket, così come vincolante con il porto in indirizzo di socket impostato a 0 senza alcun risultato.

Il mio codice è in Win32 C ++.

È stato utile?

Soluzione

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) );

Altri suggerimenti

La risposta di Graeme Perrow non funziona più perché ind_inet è deprecato. Utilizzare inet_pton invece in questo modo:

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

Non un "HowTo" diretta, ma ho utilizzato una libreria open source chiamato "ACE (Adaptive Communication Environment" per tutta la mia TCP e programmazione socket UDP e l'ho trovato molto utile e potente. Ci vuole una "pattens software" approccio per fornire blocchi di costruzione per risolvere il problema particolare. Sono stato in grado di usare il loro incapsulamento UDP per connettersi a una data porta e hanno risposte inviate ad una porta libera scelta da parte del sistema. In alternativa è possibile specificare la porta di ritorno, se lo si desidera. ACE è disponibile qui: ACE Homepage

Quando si dice "Voglio indicare quali IP locale da utilizzare, dal momento che sto correndo un paio di schede di rete", vuoi dire che si desidera specificare l'indirizzo IP, o si desidera specificare il NIC e utilizzare il indirizzo IP associato?

Se si sta tentando di specificare il NIC, questa domanda dovrebbe essere rilevante.

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