首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时设置UDP源端口?

何时设置UDP源端口?
EN

Stack Overflow用户
提问于 2014-02-20 08:07:57
回答 1查看 1.3K关注 0票数 2

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

但是,我不知道港口是什么时候随机选择的?例如,我希望依赖发件人地址来跟踪用户。它目前只有当客户端不关闭时才能工作,端口仍然是相同的,那么一个简单的memcmp就足以检测到同一个客户机。

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

代码语言:javascript
复制
#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将使用相同的地址,直到程序退出。但是,当您再次运行它时,端口是不同的。

那么,选择端口的是套接字函数吗?还是系统?确定在客户端生存期内端口仍然是相同的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-20 08:13:22

如果套接字没有显式绑定,那么当您发送第一个数据包时,操作系统将绑定它(使用随机端口)。只要套接字打开,这个绑定将是活动的,一旦它关闭,套接字(当然)是未绑定的。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21901754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档