小编27B*_*end的帖子

socket - close(2) 发送 RST 数据包而不是 FIN 数据包

我编写了一个简单的客户端和服务器,基本上客户端首先连接到服务器,然后使用 断开连接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)

c sockets network-programming tcp

2
推荐指数
1
解决办法
2926
查看次数

C - inet_pton() 不产生网络字节顺序

我对这个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_ptonis的输出b6.00.a8.c0,它转换为182.0.168.192,它也不同于 的输出htonl

由于htonl将主机字节顺序转换为网络字节顺序,所以如果inet_pton产生网络字节顺序,我想它们的输出应该是一样的?这是否意味着inet_pton实际产生主机字节顺序?

如果inet_pton已经产生network byte order,为什么我需要htonl获得正确的值?

c sockets networking network-programming endianness

0
推荐指数
1
解决办法
1739
查看次数

标签 统计

c ×2

network-programming ×2

sockets ×2

endianness ×1

networking ×1

tcp ×1