客户端和服务端字符串转字节为啥不一样?

客户端

struct hostent* h;                         // 用于存放服务端IP地址(大端序)的结构体的指针。
if ( (h = gethostbyname(argv[1])) == nullptr )  // 把域名/主机名/字符串格式的IP转换成结构体。
{
  cout << "gethostbyname failed.\n" << endl; close(sockfd); return -1;
}
memcpy(&servaddr.sin_addr,h->h_addr,h->h_length); // ③指定服务端的IP(大端序)。

服务端

servaddr.sin_addr.s_addr=inet_addr(argv[1]); // ③指定服务端的IP,只能用IP,不能用域名和主机名。

原因

  • inet_addr 这个只能转换 ip 地址
  • gethostbyname 可以支持 IP,域名等等。

对于服务端来说,给他 ip 地址就够了。但是对于客户端来说,他需要连接的更多的可能是域名,而不是 IP。

服务端为什么也要设置 IP

如果服务端是运行于多网卡的服务器上面,那么必须要明确当前这个服务端是服务于那一个网段的,通过设置 servaddr.sin_addr.s_addr 就可以确定服务的网段了。

参考

万恶的结构体