我正在编写一个非常小的C客户端。我知道,当您向服务器发送数据时,会选择一个随机端口作为源端口。我还知道,您可以使用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将使用相同的地址,直到程序退出。但是,当您再次运行它时,端口是不同的。
那么,选择端口的是套接字函数吗?还是系统?确定在客户端生存期内端口仍然是相同的吗?
发布于 2014-02-20 08:13:22
如果套接字没有显式绑定,那么当您发送第一个数据包时,操作系统将绑定它(使用随机端口)。只要套接字打开,这个绑定将是活动的,一旦它关闭,套接字(当然)是未绑定的。
而且,由于UDP套接字的无连接性质,“服务器”(如果操作正确)不应该无限期地保留所有发送给它的“客户端”的地址。相反,它应该使用在recvfrom调用中接收到的源地址,并将其用于回复。存储源地址不仅仅是简单的请求/响应的唯一原因是,如果您在UDP之上有一个更高级的协议,并有自己的“连接”处理。
https://stackoverflow.com/questions/21901754
复制相似问题