2015-11-24 3 views
0

Я создаю игру на C++ для университетского проекта, который требует некоторой функции сетевой работы с использованием Sockets. Мой лектор модуля дал нам пример кода рабочего (локального компьютера) клиента/серверов, чтобы показать нам, как он работает. Он имеет следующий код для создания сокета, который работает отлично:bind (...) всегда возвращает -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

ответ

0

Как я уже сказал в комментарии, я сделал глупую ошибку outwith объем включенного кода: в основном я запускал функцию SetupServer() в цикле обновления, и ошибка была обнаружена на второй итерации обновления. Кроме того, код отлично работает.