无法在 Linux 的套接字编程中将 in_addr 转换为 Unsigned Int

Cannot Convert in_addr to Unsigned Int in Socket Programming for Linux

我正在使用 C++ 在 TCP 中构建一个反向回显服务器。

我的问题发生在我 运行 我的客户时。

当我编译我的 client.cpp 时,我得到这个错误:

error: cannot convert ‘in_addr’ to ‘in_addr_t {aka unsigned int}’ in assignment
  serverAddress.sin_addr.s_addr = *((struct in_addr*)host->h_addr);

这是我创建连接的代码:

serverName = argv[1];
struct sockaddr_in serverAddress;
struct hostent* host;
host = gethostbyname(serverName);

memset(&serverAddress, 0, sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = *((struct in_addr*)host->h_addr);
serverAddress.sin_port = htons(serverPort);
memmove(&serverAddress.sin_addr.s_addr, host->h_addr_list[0], host->h_length);

connectValue = connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

我是不是漏掉了什么?

您正在尝试将整个 in_addr 结构实例分配给单个整数。那是行不通的。

sockaddr_in::sin_addr成员是一个in_addr结构,in_addr::s_addr成员是实际的IP地址。只需删除 s_addr 部分即可分配整个 in_addr 结构 as-is:

serverAddress.sin_addr = *((struct in_addr*)host->h_addr);

否则,您可以 memcpy()(或者,在您的示例中,memmove())将 in_addr 结构作为一个整体放入 sin_addr 成员中。您正在尝试 copy/move 到它的 s_addr 成员,所以只需删除它:

memcpy(&serverAddress.sin_addr, host->h_addr, host->h_length);