绑定(...)总是返回-1使用WinSock2 - C++

问题描述:

我正在C++中创建一个大学项目的游戏,这需要一些使用套接字的网络功能。我的模块讲师给了我们工作(本地机器)客户端/服务器的示例代码,以向我们展示它的工作原理。他设立的插座,其工作正常,下面的代码:绑定(...)总是返回-1使用WinSock2 - C++

#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; 
    } 

} 
+3

尝试调用['WSAGetLastError'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms741580%28v=vs.85%29.aspx)并查看哪些[错误代码] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx)返回。 –

+0

我不认为这是错误的原因,但是如果你将'serverIP_'和'serverPort_'传递给'SetupServer'函数,为什么你仍然使用'SERVERIP'和'SERVERPORT'中定义的宏调用'inet_addr()'和'htons'? – Alnitak

+1

刚刚意识到我犯了一个愚蠢的错误:我在更新循环中运行'SetupServer()'函数,错误在第二次迭代中被捕获。 – DeanoMachino

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