【问题标题】:How to set up a Winsock UDP socket?如何设置 Winsock UDP 套接字?
【发布时间】:2010-10-15 07:34:07
【问题描述】:

我想创建一个只向客户端发送数据的 Winsock UDP 套接字。我希望内核为我选择一个可用的端口。另一方面,我想指出要使用哪个本地 IP,因为我正在运行一些网卡。

我尝试过梳理套接字选项的迷宫,以及将套接字地址中的端口绑定设置为 0,但均无济于事。

我的代码是 Win32 C++。

【问题讨论】:

    标签: c++ winapi sockets udp winsock


    【解决方案1】:

    请原谅缺乏错误检查:

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

    【讨论】:

      【解决方案2】:

      Graeme Perrow 的答案不再起作用,因为 inet_addr 已被弃用。 像这样使用 inet_pton:

      #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);
      
          local.sin_family = AF_INET;
          inet_pton(AF_INET, srcIP, &local.sin_addr.s_addr);
          local.sin_port = htons(0);
      
          dest.sin_family = AF_INET;
          inet_pton(AF_INET, destIP, &dest.sin_addr.s_addr);
          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));
      
          closesocket(s);
          WSACleanup();
      
          return 0;
      }
      

      【讨论】:

        【解决方案3】:

        不是直接的“HowTo”,但我一直在使用一个名为“ACE(自适应通信环境”)的开源库来进行所有 TCP 和 UDP 套接字编程,发现它非常有用且功能强大。它需要一个“软件模式”提供构建块来解决您的特定问题的方法。 我能够使用他们的 UDP 封装连接到给定端口,并将回复发送到系统选择的空闲端口。或者,您可以根据需要指定返回端口。 ACE 可在此处获得: ACE Homepage

        【讨论】:

          【解决方案4】:

          当你说“我想指定使用哪个本地 IP,因为我正在运行几个网卡”时,你的意思是要指定 ip 地址,还是要指定网卡并使用关联的IP地址?

          如果您尝试指定网卡,this question 应该是相关的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-12
            • 2014-08-17
            • 2011-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多