绑定(...)总是返回-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;
}
}
答
正如我在评论说,我犯了一个愚蠢的错误outwith的包含代码的范围:基本上,我在更新循环中运行SetupServer()
函数,并且在更新的第二次迭代中捕获错误。除此之外,代码是完美的功能。
尝试调用['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)返回。 –
我不认为这是错误的原因,但是如果你将'serverIP_'和'serverPort_'传递给'SetupServer'函数,为什么你仍然使用'SERVERIP'和'SERVERPORT'中定义的宏调用'inet_addr()'和'htons'? – Alnitak
刚刚意识到我犯了一个愚蠢的错误:我在更新循环中运行'SetupServer()'函数,错误在第二次迭代中被捕获。 – DeanoMachino