bind(...) 总是使用 WinSock2 返回 -1 -- C++
Posted
技术标签:
【中文标题】bind(...) 总是使用 WinSock2 返回 -1 -- C++【英文标题】:bind(...) always returning -1 using WinSock2 -- C++ 【发布时间】:2015-11-24 23:43:13 【问题描述】:我正在为一个大学项目用 C++ 创建一个游戏,该项目需要一些使用 Sockets 的网络功能。我的模块讲师给了我们工作(本地机器)客户端/服务器的示例代码,向我们展示它是如何工作的。他有以下代码用于设置套接字,效果很好:
#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;
【问题讨论】:
尝试调用WSAGetLastError
,看看返回的是哪个error code。
我不相信这是错误的原因,但是如果您将serverIP_
和serverPort_
传递给SetupServer
函数,为什么您仍然使用为@ 定义的宏987654333@ 和 SERVERPORT
在对 inet_addr()
和 htons
的调用中?
刚刚意识到我犯了一个愚蠢的错误:我在更新循环中运行 SetupServer()
函数,而错误在第二次迭代中被捕获。
@Alnitak 我最初使用传入的变量,但由于m_serverIP
不是const
,我觉得这可能会导致错误(显然不是)。
另外,一般建议:WSAStartup
只应在程序中调用一次(通常在 main
开头的某处;不要忘记在结尾)。将它放在 ctor 中,会导致每次实例化类时都会调用它(尽管如果你只有一个实例,这里可能不是这种情况)。
【参考方案1】:
正如我在评论中所说,我在包含的代码范围之外犯了一个愚蠢的错误:基本上我在更新循环中运行SetupServer()
函数,并且在更新的第二次迭代中发现了错误。除此之外,代码功能完善。
【讨论】:
以上是关于bind(...) 总是使用 WinSock2 返回 -1 -- C++的主要内容,如果未能解决你的问题,请参考以下文章