c++ - WinSock 无缘无故返回 SOCKET_ERROR

标签 c++ winsock2

我正在使用 WINSOCK 学习基本的网络编程。服务器构建和执行都很好,除了它没有通过返回 SOCKET_ERROR 的 bind()。

输出:“错误:SOCKET_ERROR (-1)”

代码:

#pragma once
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment (lib,"ws2_32.lib")
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <string>
#include <iostream>

SOCKET NewConnection;

bool ListenForConnection(int PORT, std::string IP)
{
    WSADATA wsadata;
    int wsa_error = WSAStartup(0x0202, &wsadata);
    if (wsa_error)
    {
        std::cerr << WSAGetLastError() << std::endl;
        return false;
    }
    if (wsadata.wVersion != 0x0202)
    {
        std::cerr << WSAGetLastError() << std::endl;
        WSACleanup();
        return false;
    }

    SOCKADDR_IN IncomingClient;
    IncomingClient.sin_family = AF_INET;
    IncomingClient.sin_port = htons(PORT);
    inet_pton(AF_INET, IP.c_str(), &(IncomingClient));

    NewConnection = socket(AF_INET, SOCK_STREAM, NULL);
    if (NewConnection == INVALID_SOCKET)
    {
        std::cerr << "Error: " << NewConnection << std::endl;
        return false;
    }
    if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR))
    {
        std::cerr << "Error: SOCKET_ERROR (-1)" << std::endl;
        return false;
    }
    listen(NewConnection, SOMAXCONN);

}



int main()
{
    int PORT = 1337;
    std::string IP = "0.0.0.0";
    ListenForConnection(PORT, IP);
    system("pause");
    return 0;
}

最佳答案

inet_pton(AF_INET, IP.c_str(), &(IncomingClient));

inet_pton 需要一个 IN_ADDR,而不是已提供的 SOCKADDR_INSOCKADDR_IN 包含一个 IN_ADDR,因此 OP 需要稍微不同地进行调用以提供指向 sin_addr 成员的指针:

inet_pton(AF_INET, IP.c_str(), &(IncomingClient.sin_addr));

然后他们需要解决一些其他问题,例如 ListenForConnection 末尾缺少的 return true;,错位的括号

                                                                         This bracket here V
if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR))
                                                            should be here ^

并且不检查

的返回码
listen(NewConnection, SOMAXCONN);

他们应该可以开始了。

关于c++ - WinSock 无缘无故返回 SOCKET_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41682578/

相关文章:

c++ - 获取 OpenCV 图像类型的枚举名称(例如 CV_32FC1)?

c++ - 在 C++ 中编写外部程序以与 wpa_supplicant 交互

c++ - 在 C++ 中为每个平台定义函数的首选方法是什么

c++ - 未找到 MinGW msys 包 : General advice how to proceed

c# - TCP/IP Windows 7 环回适配器上的数据包延迟问题(或软件错误?)

c++ - 非阻塞 Connect() 上的 WSAEWOULDBLOCK 错误

c++ - 寻找整数可以表示为唯一自然数的 n 次幂之和的方法。给出错误输出的代码

c - UDP 客户端未收到 UDP 服务器消息

c++ - 关于在 winsock 的 addrinfo 结构中使用智能指针的问题

c - 带有 2 个客户端的 UDP 服务器,如何为它们分配特定端口