gpt4 book ai didi

c - UDP源端口什么时候设置?

转载 作者:行者123 更新时间:2023-12-03 11:50:37 24 4
gpt4 key购买 nike

我正在编写一个非常小的 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 将使用相同的地址,直到程序退出。但是,当您再次运行时,端口不同。

那么选择端口是socket函数吗?还是系统?确定端口在客户端生命周期内仍然相同吗?

最佳答案

如果套接字没有显式绑定(bind),那么当您发送第一个数据包时,操作系统将绑定(bind)它(使用随机端口)。只要套接字打开,此绑定(bind)就会处于事件状态,一旦关闭,套接字(当然)就会解除绑定(bind)。

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

关于c - UDP源端口什么时候设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21901754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com