gpt4 book ai didi

C - getaddrinfo 返回 "Servname not supported for ai_socktype"

转载 作者:行者123 更新时间:2023-12-05 00:48:14 32 4
gpt4 key购买 nike

所以,在我得到这个错误之后,我一直在这里寻找答案,几乎每个人都有一个很难解决这个错误的方法,但是没有人解释为什么会发生这个错误,所以我不认为这个问题是完全重复。

我用 C 语言编写了一个 TCP 套接字,并使用“getaddrinfo”函数使套接字与主机名一起工作,它工作得很好!您可以在 github 上找到我的代码.

但是当我试图创建一个 UDP socket通过“getaddrinfo”我得到了这个错误:
ai_socktype 不支持 Servname

客户端.c

const char *host = argv[1];
const char *service = argv[2];
const char *string = argv[3];

struct addrinfo addrCriteria;
memset(&addrCriteria, 0, sizeof(addrCriteria));
addrCriteria.ai_family = AF_UNSPEC;
addrCriteria.ai_socktype = SOCK_DGRAM;
addrCriteria.ai_protocol = IPPROTO_UDP;

struct addrinfo *servAddr;
int ret = getaddrinfo(host, service, &addrCriteria, &servAddr);
if(ret != 0)
sysError(gai_strerror(ret));

我意识到,当我给“服务”提供一个像 8080 这样的数字输入时,不会返回任何错误,但是当我使用一个字符串作为服务名称时,比如指向端口/8081 的“tproxy”,“gai_strerror”会返回提到的错误。

显然,gai_strerror 说:“'SOCK_DGRAM' 套接字类型不支持服务名称”,但为什么呢?我的意思是“getaddrinfo”不支持通过 UDP 套接字的名称服务的确切原因?
有没有其他方法可以使用带有 UDP 套接字的服务名称而不是端口号?如何?

最佳答案

TL;DR: 没有 tproxy UDP 端口。

如果您查找 tproxy服务数据库中的 UDP 套接字服务,

getent services tproxy/udp

你没有输出,因为 tproxy不是 UDP 服务。如果你看所有 tproxy服务,无论协议(protocol)如何, getent services | grep -e tproxy , 你会看到的
tproxy    8081/tcp

这意味着 tproxy服务仅针对 TCP 协议(protocol)定义。

这意味着如果你问 getaddrinfo() 用于服务的 UDP 套接字 8081 ,您将找不到任何东西,因为 tproxy仅针对 TCP 而不是 UDP 定义。

与您请求 xmpp-client 的 UDP 套接字的情况相比服务。至少我的服务数据库( getent services xmpp-client/udp )响应
xmpp-client           5222/udp jabber-client

确实, getaddrinfo()愉快地为此类 UDP 套接字提供了套接字描述(使用 xmpp-clientjabber-client 作为服务)。

所以,有像 xmpp-client 这样的服务。确实定义了 TCP 和 UDP 端口。在我的系统上, getent services | grep -e xmpp-client节目
xmpp-client           5222/tcp jabber-client
xmpp-client 5222/udp jabber-client

因为 TCP 和 UDP 是基于 IP 的不同协议(protocol),所以服务可以使用不同的端口号进行 TCP 和 UDP 通信是有意义的。因此,假设服务数据库应该只为 TCP 和 UDP 套接字返回相同的端口号是不合理的。

换句话说,您遇到错误是因为您错误地认为由于某些服务使用 TCP 端口,并且在服务数据库中注册了名称,您也应该能够使用该名称来指定 UDP 端口号。

TCP 和 UDP 是独立的协议(protocol),它们的端口号空间是独立的。例如,Unix exec 使用 TCP 端口 512。 r-service,而 biff 使用 UDP 端口 512邮件通知服务。

关于C - getaddrinfo 返回 "Servname not supported for ai_socktype",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45088595/

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