Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的UDP客户端源端口?_C - Fatal编程技术网

C中的UDP客户端源端口?

C中的UDP客户端源端口?,c,C,我正在编写一个UDP客户端,我需要在要发送的数据中提到UDP数据包的源端口 我的程序如何获得内核生成的随机端口号,udp客户端使用该端口号向voip服务器发送数据。 所以 如何在发送数据之前指定特定的UDP源端口 我将非常感激。请尽快回复我。我的项目就此停止 您应该将(2)套接字绑定到您选择的端口。另见 man7ip和man7udp使用bind将套接字绑定到端口0,这将允许您使用getsockname获取端口。如果愿意,还可以将套接字绑定到特定端口 例如(假设IPv4套接字,无错误检查): 或者

我正在编写一个UDP客户端,我需要在要发送的数据中提到UDP数据包的源端口

  • 我的程序如何获得内核生成的随机端口号,udp客户端使用该端口号向voip服务器发送数据。 所以
  • 如何在发送数据之前指定特定的UDP源端口 我将非常感激。请尽快回复我。我的项目就此停止

    您应该
    将(2)
    套接字绑定到您选择的端口。另见
    man7ip
    man7udp

    使用
    bind
    将套接字绑定到端口0,这将允许您使用
    getsockname
    获取端口。如果愿意,还可以将套接字绑定到特定端口

    例如(假设IPv4套接字,无错误检查):

    或者,如果您与单个服务器通信,您可以在UDP套接字上使用
    connect
    (这也给了您方便的副作用,允许您使用
    send
    而不是
    sendto
    ,并使UDP套接字只接受来自“已连接”对等方的数据报),然后使用
    getsockname
    获取您的本地端口/地址。在使用
    connect
    之前,您仍然可以选择绑定套接字

    例如:


    我无法解决这个问题,你能给我一些代码段吗?首先展示你的非工作代码,并解释它以什么方式不工作(错误代码,意外行为…)。
    struct sockaddr_in sin = {};
    socklen_t slen;
    int sock;
    short unsigned int port;
    
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_port = 0;
    
    bind(sock, (struct sockaddr *)&sin, sizeof(sin));
    /* Now bound, get the address */
    slen = sizeof(sin);
    getsockname(sock, (struct sockaddr *)&sin, &slen);
    port = ntohs(sin.sin_port);
    
    struct sockaddr_in sin = {};
    socklen_t slen;
    int sock;
    short unsigned int port;
    
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    /* set sin to your target host... */
    ...
    connect(sock, (struct sockaddr *)&sin, sizeof(sin));
    /* now retrieve the address as before */
    slen = sizeof(sin);
    getsockname(sock, (struct sockaddr *)&sin, &slen);
    port = ntohs(sin.sin_port);