c - 在 Windows 上为一个 libevent 绑定(bind)创建 3 个套接字?

标签 c sockets winapi libevent

我正在编写一个 BitTorrent 客户端,以了解有关网络的更多信息,并且我正在努力通过 Google 找到一些东西。作为 BT 规范的一部分,我需要一台服务器来监听与我的计算机的对等连接。在 win32 端口中,我有这样的代码来设置我的服务器

struct sockaddr_in saServer;
struct hostent* localHost;
char* localIP;

// Get the local host information
localHost = gethostbyname("");
localIP = inet_ntoa(*(struct in_addr *)*localHost->h_addr_list);

saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr(localIP);
saServer.sin_port = htons(6881);


struct evconnlistener *listener = evconnlistener_new_bind(base, accept_conn_cb, NULL,
    LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1, (SOCKADDR*)&saServer, sizeof(saServer));

这似乎有效,但如果我查看 netstat,我会看到以下内容,

BitTorrentClient.exe    6092    TCP hostname    50216   localhost   50217   ESTABLISHED                                     
BitTorrentClient.exe    6092    TCP hostname    50217   localhost   50216   ESTABLISHED                                     
BitTorrentClient.exe    6092    TCP hostname.home 6881  hostname    0   LISTENING   

为什么还有另外两个连接,一个来自端口 50216->50217,另一个从 50217->50216 环回?我预计端口 6881 上只有一个监听连接。这是 libevent 的一个怪癖,还是与网络相关的更基本的东西?

我可以搜索什么来了解其他两个端口的用途?

最佳答案

这很可能是 libevent 调用 evutil_make_internal_pipe_ 的结果内部。

Libevent 为 inter-thread communication 创建内部“管道”和 signal delivery使用socketpair(2)在 POSIX 兼容系统上,而在 Windows 上 libevent 必须手动求助 connecting two sockets together相反。

关于c - 在 Windows 上为一个 libevent 绑定(bind)创建 3 个套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49609737/

相关文章:

c++ - 如果计算机在 sleep 模式下突然断电,系统注册表的状态?

C 指针数组不适用于 memcpy

c - malloc/结构指针数组段错误

c - 通过 udp 套接字发送结构

java - 防止设备改变ip

c++ - 使用 <urlmon.h> 和 URLDownloadToFile 获取 HTTPS Web 资源

c - 客户端服务器 udp c 错误

c - 与 gcc 相比,为什么 clang 对寄存器变量的行为很奇怪?

delphi - 从 120 更新到 Indy 130 软件包,现在此代码不起作用

winapi - 路径前面的 "\\?\"是什么意思?