我编写了一个简单的客户端和服务器,基本上客户端首先连接到服务器,然后使用 断开连接close(2)
,如下所示:
/* setting server address and other stuff */
...
connect();
close();
Run Code Online (Sandbox Code Playgroud)
connect()
调用和之间没有其他操作close()
。
服务器接受连接并用于epoll(7)
监视 EPOLLOUT 事件。当epoll报告EPOLLOUT时,服务器向客户端写入1个字节。
nev = epoll_wait(ep, events, 10, -1);
for (int i=0; i<nev; i++) {
std::cout << "ready, events: " << std::hex
<< events[i].events << std::dec << std::endl;
if (events[i].data.fd == sockfd) {
int connfd = accept(sockfd, (struct sockaddr*)&client, &len);
if (connfd < 0) {
std::cout << strerror(errno) << std::endl;
exit(0);
}
std::cout << "accpeted\n";
struct epoll_event ev;
ev.events …
Run Code Online (Sandbox Code Playgroud) 我对这个inet_pton()
功能感到困惑。根据手册页
该函数将字符串src转换为 af 地址族中的网络地址结构,然后将网络地址结构复制到dst。af 参数必须是 AF_INET 或 AF_INET6。dst以网络字节顺序写入。
因此该函数产生一个网络字节顺序值。但我得到了这个代码:
struct sockaddr_in a;
char sip[20];
inet_pton(AF_INET, "192.168.0.182", (void *)&a.sin_addr);
inet_ntop(AF_INET, (void *)&a.sin_addr, sip, 20);
printf("htonl:%08x\n", htonl(a.sin_addr.s_addr));
printf("inet_pton:%08x\n", a.sin_addr.s_addr);
printf("inet_ntop:%s\n", sip);
Run Code Online (Sandbox Code Playgroud)
输出:
htonl:c0a800b6
inet_pton:b600a8c0
inet_ntop:192.168.0.182
Run Code Online (Sandbox Code Playgroud)
inet_pton
is的输出b6.00.a8.c0
,它转换为182.0.168.192
,它也不同于 的输出htonl
。
由于htonl
将主机字节顺序转换为网络字节顺序,所以如果inet_pton
产生网络字节顺序,我想它们的输出应该是一样的?这是否意味着inet_pton
实际产生主机字节顺序?
如果inet_pton
已经产生network byte order
,为什么我需要htonl
获得正确的值?