【问题标题】:listen returns without waiting for a connection监听返回而不等待连接
【发布时间】:2021-01-07 08:20:04
【问题描述】:

当我运行我的程序时,我得到了输出

Listening on port 65004
listen -> 0

为什么listen 不等待连接就返回了?

#define PORT 65004

bool listen_on_port(int port)
{
    WSADATA wsadata;
    int error = WSAStartup(0x0202, &wsadata);
    if (error)
    {
        return false;
    }
    if (wsadata.wVersion != 0x0202)             //Wrong Winsock version?
    {
        WSACleanup();
        return false;
    }
    // Open a socket.
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    // Bind the socket to the port it will be listening on.
    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (SOCKET_ERROR == bind(sock, (LPSOCKADDR)&addr, sizeof(addr)))
    {
        WSACleanup();
        return false;
    }
    std::cout << "Listening on port " << port << '\n';
    auto r = listen(sock, SOMAXCONN);
    std::cout << "listen -> " << r << '\n';
    if (r == SOCKET_ERROR) {
        printf("Listen failed with error: %ld\n", WSAGetLastError());
        closesocket(sock);
        WSACleanup();
        return false;
    }
    return true;
}

【问题讨论】:

    标签: c++ windows sockets


    【解决方案1】:

    零表示调用成功。但是,我认为这个问题是对listen 所做的事情的误解。 Linux man page 有一个很好的解释,但它与 winsock 的工作方式相同:

    listen() 将 sockfd 引用的套接字标记为被动套接字, 也就是说,作为一个套接字,将用于接受传入的连接 使用accept(2)请求。

    accept 等待传入连接并返回一个新套接字,您可以使用该套接字与客户端进行通信。见here:

    accept() 系统调用与基于连接的套接字类型一起使用 (SOCK_STREAM,SOCK_SEQPACKET)。它提取第一个连接 请求侦听套接字的挂起连接队列, sockfd,创建一个新的连接套接字,并返回一个新文件 引用该套接字的描述符。新创建的套接字不是 处于聆听状态。原始套接字 sockfd 不受 这个电话。

    我也可以推荐Beej's Guide to Network Programming

    编辑:添加到 winsock API 页面的链接: listen, accept(我仍然认为 Linux 手册页有更好的解释 listen 的作用)

    【讨论】:

    • 问题中的代码适用于 Windows(因此有 windows 标签和 Winsock 的使用)。虽然细节相似,但特定于 Windows 的参考而不是 Linux 手册页的链接会更相关。
    • @Iridium Fair 点,我在答案中添加了一些 winsock 链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多