【问题标题】:Can server know the hostname of client in socket programming C服务器可以在套接字编程C中知道客户端的主机名吗
【发布时间】:2021-03-12 20:41:09
【问题描述】:

在客户端和服务器之间的套接字编程通信。
当客户端向服务器发送消息时。

  1. 服务器能否知道或确定客户端的主机名?
  2. 是否必须由客户端手动传递?
  3. 从客户端向服务器传递消息的正常方式是write(fd, clientMessage, sizeof(clientMessage));
    假设有一些头信息要共享,比如主机名。
    只能这样通过吗?还是有更好的选择?

【问题讨论】:

  • 知道IP,所以可以查询DNS。
  • ..假设可以访问适当的 DNS 服务器。
  • 如果你有一个已连接的套接字(如 TCP 套接字),那么你可以使用 getpeername 函数来获取对端(连接的另一端)的“名称”(地址)。从那里你可以使用例如(过时的)gethostbyaddr 函数,或现代替代函数 getaddrinfo
  • 如何将消息从客户端传递到服务器取决于通信协议。如果附加信息是协议的一部分,您也必须(以某种方式)发送它。可能会发生部分 readwrite 操作,例如您的代码可能想要写入 10 个字节,但在第一次调用中只写入了 5 个字节。在这种情况下,您将不得不使用剩余数据重复 write 调用。
  • @Someprogrammerdude "...,或者现代的替代方法 getaddrinfo" - 你的意思是 getnameinfo()getaddrinfo() 将 IP/主机名字符串转换为二进制 IP 地址。 getnameinfo() 将二进制 IP 地址转换为主机名字符串。

标签: c sockets server client


【解决方案1】:

服务器能否知道或确定客户端的主机名?

没有。服务器只有客户端 IP 地址。虽然它可以尝试reverse DNS lookup,但它返回的信息是不可靠的,即可能一开始没有设置 DNS PTR 记录,或者 PTR 记录可能只是声称 IP 和主机名之间的任意映射,比如声称是 google。 com.

是否必须由客户端手动传递?

在 TCP 中没有自动的方法来做到这一点。但就像 PTR 记录一样 - 信息不可靠,因为客户可以声称是任何东西。

从客户端向服务器传递消息的正常方式是 write(fd, clientMessage, sizeof(clientMessage));。 ...是否必须像这样通过...

如何通过并不重要。重要的是客户端和服务器以相同的方式达成一致,这样服务器才能真正从数据中提取信息。

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多