C-getaddrinfo返回值“;ai“U socktype”不支持Servname;

C-getaddrinfo返回值“;ai“U socktype”不支持Servname;,c,sockets,udp,getaddrinfo,C,Sockets,Udp,Getaddrinfo,所以,在我得到这个错误后,我一直在这里寻找答案,几乎每个人都有一个困难的方法来修复这个错误,但没有人解释为什么会发生这个错误,所以我不认为这个问题是完全重复的 我用C编写了一个TCP套接字,并使用“getaddrinfo”函数使套接字与主机名一起工作,它工作得非常好!你可以在上面找到我的密码 但当我试图通过“getaddrinfo”创建一个时,我遇到了以下错误: ai_socktype不支持Servname 客户c 我意识到,当我给“服务”一个数字输入(如8080)时,不会返回任何错误,但当我使

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

我用C编写了一个TCP套接字,并使用“getaddrinfo”函数使套接字与主机名一起工作,它工作得非常好!你可以在上面找到我的密码

但当我试图通过“getaddrinfo”创建一个时,我遇到了以下错误:
ai_socktype不支持Servname

客户c

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

显然,gai_strerror说:“SOCK_DGRAM”套接字类型不支持服务名称”,但为什么呢?我是说“getaddrinfo”不支持UDP套接字上的名称服务的确切原因是什么?

是否有其他方法将服务名称与UDP套接字一起使用,而不是使用端口号?如何操作?

当为
服务
参数提供非数字值时,(在Linux上)会在/etc/services文件中查找该参数。此文件将服务名称映射到端口/协议。以下是一些示例条目:

ssh             22/tcp  
telnet          23/tcp
domain          53/tcp                          # name-domain server
domain          53/udp

出现错误的原因是/etc/services文件中没有“tproxy”的UDP条目。查看此文件,并查找指定UDP端口(如“域”)的条目。应该有53/tcp和53/udp的条目。如果您将“域”作为服务名称传入,您应该会返回一个结果。

TL;DR:没有
tproxy
UDP端口


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

getent services tproxy/udp
您没有得到任何输出,因为
tproxy
不是UDP服务。如果您查看所有
tproxy
服务,而不考虑协议,
getent服务| grep-e tproxy
,您将看到

tproxy    8081/tcp
这意味着只为TCP协议定义了
tproxy
服务

这意味着,如果您为服务
8081
请求UDP套接字,您将找不到任何内容,因为
tproxy
仅为TCP而不是UDP定义

与为
xmpp客户机
服务请求和UDP套接字的情况进行比较。至少我的服务数据库(
getent services xmpp客户端/udp
)响应为

xmpp-client           5222/udp jabber-client
实际上,
getaddrinfo()
很高兴地为这些UDP套接字提供了套接字描述(使用
xmpp-client
jabber-client
作为服务)

因此,有些服务(如
xmpp-client
)同时定义了TCP和UDP端口。在我的系统上,
getentservices | grep-exmpp客户端
显示

xmpp-client           5222/tcp jabber-client
xmpp-client           5222/udp jabber-client
因为TCP和UDP是IP上的不同协议,所以服务可以使用不同的端口号进行TCP和UDP通信。因此,假设服务数据库只返回TCP和UDP套接字的相同端口号是不合理的

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


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

我简直不敢相信我遗漏了“/etc/services”文件以及TCP和UDP的不同服务名!这让我想起了我的主要错误。它与为TCP和UDP连接定义的“http alt”servname一起工作。是的,谢谢你的解释!我理解这些答案是关于命名服务的,但是当使用AI|u PASSIVE | AI|u ADDRCONFIG、AF_INET6和带有空主机的数字端口时,答案是什么?我期待一个成功的结果,然后我可以馈送到绑定,但无论如何得到了“Servname不支持ai_socktype错误”。(港口为5454)
xmpp-client           5222/tcp jabber-client
xmpp-client           5222/udp jabber-client