繁体   English   中英

何时设置UDP源端口?

[英]When is the UDP source port set?

我正在编写一个非常小的C UDP客户端。 我知道将数据发送到服务器时会选择一个随机端口作为源端口。 我也知道您可以使用bind来指定自己想要响应的端口。

但是,我不知道什么时候随机选择端口? 例如,我想依靠发件人地址来跟踪用户。 当前仅在客户端未关闭,端口仍然相同时才起作用,然后简单的memcmp足以检测相同的客户端。

此小代码将使用相同的源端口,直到退出:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>

int main(void)
{
    int s, error, ch;
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof (struct addrinfo));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;

    if ((error = getaddrinfo("localhost", "9988", &hints, &res)))
            errx(1, "%s", gai_strerror(error));

    if ((s = socket(res->ai_family, res->ai_socktype, 0)) < 0)
            err(1, "socket");

    while ((ch = fgetc(stdin)) != EOF)
            sendto(s, &ch, 1, 0, res->ai_addr, res->ai_addrlen);
}

并运行类似:dmesg | ./client将使用相同的地址,直到程序退出。 但是,当您再次运行它时,端口是不同的。

那么是选择端口的套接字功能吗? 还是系统? 是否确定在客户端生存期内端口仍将相同?

如果未显式绑定套接字,则当您发送第一个数据包时,操作系统会(使用随机端口)将其绑定。 只要套接字处于打开状态,此绑定将处于活动状态,一旦关闭,套接字将(当然)解除绑定。

并且由于UDP套接字的无连接性质,“服务器”(如果正确完成)不应保留无限期发送给它的所有“客户机”的地址。 相反,它应该使用recvfrom调用中接收到的源地址,并将其用于回复。 存储源地址而不只是简单的请求/响应的唯一原因是,如果您在UDP之上具有更高级的协议,并且具有自己的“连接”处理功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM