WinSock 无缘无故返回 SOCKET_ERROR
WinSock returning SOCKET_ERROR for no apparent reason
我正在使用 WINSOCK 学习基本的网络编程。服务器构建和执行都很好,除了它没有通过 returns SOCKET_ERROR 的 bind()。
输出:"Error: SOCKET_ERROR (-1)"
代码:
#pragma once
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment (lib,"ws2_32.lib")
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <string>
#include <iostream>
SOCKET NewConnection;
bool ListenForConnection(int PORT, std::string IP)
{
WSADATA wsadata;
int wsa_error = WSAStartup(0x0202, &wsadata);
if (wsa_error)
{
std::cerr << WSAGetLastError() << std::endl;
return false;
}
if (wsadata.wVersion != 0x0202)
{
std::cerr << WSAGetLastError() << std::endl;
WSACleanup();
return false;
}
SOCKADDR_IN IncomingClient;
IncomingClient.sin_family = AF_INET;
IncomingClient.sin_port = htons(PORT);
inet_pton(AF_INET, IP.c_str(), &(IncomingClient));
NewConnection = socket(AF_INET, SOCK_STREAM, NULL);
if (NewConnection == INVALID_SOCKET)
{
std::cerr << "Error: " << NewConnection << std::endl;
return false;
}
if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR))
{
std::cerr << "Error: SOCKET_ERROR (-1)" << std::endl;
return false;
}
listen(NewConnection, SOMAXCONN);
}
int main()
{
int PORT = 1337;
std::string IP = "0.0.0.0";
ListenForConnection(PORT, IP);
system("pause");
return 0;
}
在
inet_pton(AF_INET, IP.c_str(), &(IncomingClient));
inet_pton
需要 IN_ADDR
,而不是已提供的 SOCKADDR_IN
。 SOCKADDR_IN
包含一个 IN_ADDR
,因此 OP 需要稍微不同地进行调用以提供指向 sin_addr
成员的指针:
inet_pton(AF_INET, IP.c_str(), &(IncomingClient.sin_addr));
然后他们需要解决其他一些问题,例如 ListenForConnection
末尾缺少 return true;
,错位的括号
This bracket here V
if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR))
should be here ^
并且不检查
的 return 代码
listen(NewConnection, SOMAXCONN);
他们应该可以走了。
我正在使用 WINSOCK 学习基本的网络编程。服务器构建和执行都很好,除了它没有通过 returns SOCKET_ERROR 的 bind()。
输出:"Error: SOCKET_ERROR (-1)"
代码:
#pragma once
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment (lib,"ws2_32.lib")
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <string>
#include <iostream>
SOCKET NewConnection;
bool ListenForConnection(int PORT, std::string IP)
{
WSADATA wsadata;
int wsa_error = WSAStartup(0x0202, &wsadata);
if (wsa_error)
{
std::cerr << WSAGetLastError() << std::endl;
return false;
}
if (wsadata.wVersion != 0x0202)
{
std::cerr << WSAGetLastError() << std::endl;
WSACleanup();
return false;
}
SOCKADDR_IN IncomingClient;
IncomingClient.sin_family = AF_INET;
IncomingClient.sin_port = htons(PORT);
inet_pton(AF_INET, IP.c_str(), &(IncomingClient));
NewConnection = socket(AF_INET, SOCK_STREAM, NULL);
if (NewConnection == INVALID_SOCKET)
{
std::cerr << "Error: " << NewConnection << std::endl;
return false;
}
if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR))
{
std::cerr << "Error: SOCKET_ERROR (-1)" << std::endl;
return false;
}
listen(NewConnection, SOMAXCONN);
}
int main()
{
int PORT = 1337;
std::string IP = "0.0.0.0";
ListenForConnection(PORT, IP);
system("pause");
return 0;
}
在
inet_pton(AF_INET, IP.c_str(), &(IncomingClient));
inet_pton
需要 IN_ADDR
,而不是已提供的 SOCKADDR_IN
。 SOCKADDR_IN
包含一个 IN_ADDR
,因此 OP 需要稍微不同地进行调用以提供指向 sin_addr
成员的指针:
inet_pton(AF_INET, IP.c_str(), &(IncomingClient.sin_addr));
然后他们需要解决其他一些问题,例如 ListenForConnection
末尾缺少 return true;
,错位的括号
This bracket here V
if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR))
should be here ^
并且不检查
的 return 代码listen(NewConnection, SOMAXCONN);
他们应该可以走了。