【发布时间】:2021-03-12 20:41:09
【问题描述】:
在客户端和服务器之间的套接字编程通信。
当客户端向服务器发送消息时。
- 服务器能否知道或确定客户端的主机名?
- 是否必须由客户端手动传递?
- 从客户端向服务器传递消息的正常方式是
write(fd, clientMessage, sizeof(clientMessage));。
假设有一些头信息要共享,比如主机名。
只能这样通过吗?还是有更好的选择?
【问题讨论】:
-
知道IP,所以可以查询DNS。
-
..假设可以访问适当的 DNS 服务器。
-
如果你有一个已连接的套接字(如 TCP 套接字),那么你可以使用
getpeername函数来获取对端(连接的另一端)的“名称”(地址)。从那里你可以使用例如(过时的)gethostbyaddr函数,或现代替代函数getaddrinfo。 -
如何将消息从客户端传递到服务器取决于通信协议。如果附加信息是协议的一部分,您也必须(以某种方式)发送它。可能会发生部分
read或write操作,例如您的代码可能想要写入 10 个字节,但在第一次调用中只写入了 5 个字节。在这种情况下,您将不得不使用剩余数据重复write调用。 -
@Someprogrammerdude "...,或者现代的替代方法 getaddrinfo" - 你的意思是
getnameinfo()。getaddrinfo()将 IP/主机名字符串转换为二进制 IP 地址。getnameinfo()将二进制 IP 地址转换为主机名字符串。