bind(...) 使用 WinSock2 总是返回 -1 —— C++

bind(...) always returning -1 using WinSock2 -- C++

我正在为一个大学项目用 C++ 创建一个游戏,该项目需要使用套接字的一些网络功能。我的模块讲师给了我们工作(本地机器)client/servers 的示例代码,向我们展示它是如何工作的。他有以下设置套接字的代码,工作正常:

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define SERVERIP     "127.0.0.1"
#define SERVERPORT   5555

void main(){
    WSADATA w;
    int error = WSAStartup(0x0202, &w);
    if (error != 0)
    {
        die("WSAStartup failed");
    }
    if (w.wVersion != 0x0202)
    {
        die("Wrong WinSock version");
    }

    // Create a TCP socket that we'll use to listen for connections.
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == INVALID_SOCKET)
    {
        die("socket failed");
    }

    // Fill out a sockaddr_in structure to describe the address we'll listen on.
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(SERVERIP);
    // htons converts the port number to network byte order (big-endian).
    serverAddr.sin_port = htons(SERVERPORT);

    // Bind the server socket to that address.
    if (bind(serverSocket, (const sockaddr *) &serverAddr, sizeof(serverAddr)) != 0)
    {
        die("bind failed");
    }
}

然而,当我复制大部分代码时,bind(...) 函数一直返回 -1,这与我的讲师示例中的 0 相反。这是我的代码的相关部分,使用 类:

TCPSocket.h

#define SERVERIP     "127.0.0.1"
#define SERVERPORT   5555

#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

class TCPSocket {
public:
    TCPSocket();
    ~TCPSocket();

    void SetupServer(char* serverIP_, int serverPort_, int messageSize_);

protected:

private:

    SOCKET m_socket;
    sockaddr_in m_serverAddress;

    char* m_serverIP;
    int m_serverPort;
    int m_messageSize;
};

TCPSocket.cpp

TCPSocket::TCPSocket() {
    // Initialise WinSock Library, version 2.2
    WSADATA w;
    int error = WSAStartup(0x0202, &w);
    if(error != 0) {
        //error
        int i = 0;
    }
    if(w.wVersion != 0x0202) {
        //error
        int i = 0;
    }
}

void TCPSocket::SetupServer(char* serverIP_, int serverPort_, int messageSize_) {
    m_serverIP = serverIP_;
    m_serverPort = serverPort_;
    m_messageSize = messageSize_;

    // Create TCP socket
    m_socket = socket(AF_INET, SOCK_STREAM, 0);
    if(m_socket == INVALID_SOCKET) {
        //error
        int i = 0;
    }

    m_serverAddress.sin_family = AF_INET;
    m_serverAddress.sin_addr.s_addr = inet_addr(SERVERIP);
    m_serverAddress.sin_port = htons(SERVERPORT);       // htons: port -> network byte order (big-endian)

    // Bind server socket to address
    int bindex = bind(m_socket, (const sockaddr *) &m_serverAddress, sizeof(m_serverAddress));
    if(bindex != 0) {
        //error
        int a = 0;
    }

}

正如我在评论中所说,我在所包含代码的范围之外犯了一个愚蠢的错误:基本上我是 运行 更新循环中的 SetupServer() 函数并且错误被捕获在更新的第二次迭代中。除此之外,代码功能完美。