这是我在这个伟大的网站上的第一个问题 .
我正在编写一个简单的服务器,从用户那里获取端口号:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <string>
#include <cstring>
class socketConexion {
private:
WSADATA wsaData;
int iResultado;
SOCKET socketServidor = INVALID_SOCKET; socket servidor
SOCKET socketCliente = INVALID_SOCKET;
struct sockaddr *clienteSockaddr;
struct addrinfo *socketResultado = NULL;
struct addrinfo datosServidor;
std::string puertoUsuario;
char clienteIPV4[LONG_IPV4];
public:
int iniciarWinsock () {
iResultado = WSAStartup(MAKEWORD(2,2), &wsaData);
printf ("Inicializando Winsock2 \n");
if (iResultado != 0) {
printf ("Error al iniciar Winsock2: %d\n", iResultado);
return 1;
else {
printf ("Winsock2 Inicializado\n");
return 0;
}
}
int obtenerDirServidor () {
printf ("Introduzca puerto: ");
std::cin >> puertoUsuario;
printf ("Obteniendo datos de servidor.\n");
ZeroMemory(&datosServidor, sizeof(datosServidor));
datosServidor.ai_family = AF_INET;
datosServidor.ai_socktype = SOCK_STREAM;
datosServidor.ai_protocol = IPPROTO_TCP;
datosServidor.ai_flags = AI_PASSIVE;
iResultado = getaddrinfo(NULL, (const char*)puertoUsuario.c_str(), &datosServidor, &socketResultado);
if (iResultado != 0) {
printf ("Error al obtener dirección de servidor: %d\n", iResultado);
WSACleanup();
return 1;
}
else {
printf ("Dirección de servidor obtenida.\n");
return 0;
}
}
int socketBind () {
socketServidor = socket(socketResultado->ai_family, socketResultado->ai_socktype, socketResultado->ai_protocol);
if (socketServidor == INVALID_SOCKET) {
printf ("Error al crear socket: %d\n", WSAGetLastError ());
freeaddrinfo (socketResultado);
WSACleanup();
return 1;
}
else {
printf ("Socket creado correctamente.\n");
return 0;
}
iResultado = bind(socketServidor, socketResultado->ai_addr, (int)socketResultado->ai_addrlen);
if (iResultado == SOCKET_ERROR) {
printf ("Error al direccionar socket: %d\n", WSAGetLastError());
freeaddrinfo (socketResultado);
closesocket(socketServidor);
WSACleanup();
return 1;
}
else {
printf ("Socket direccionado correctamente. \n");
return 0;
}
freeaddrinfo (socketResultado);
}
int socketListen (){
iResultado = listen(socketServidor, SOMAXCONN);
if (iResultado == SOCKET_ERROR) {
printf ("Error al poner socket a la escucha socket: %d\n", WSAGetLastError());
closesocket(socketServidor);
WSACleanup();
return 1;
}
else {
printf ("Esperando conexión..... %d\n");
return 0;
}
.....
我在调用listen函数时得到错误10022,我看不到传递给函数的无效参数 .
1 回答
错误代码10022是WSAEINVAL:
根据listen() documentation:
在
socketBind()
方法中,如果socket()
成功,则在调用bind()
之前调用return
,因此套接字永远不会被绑定 . 您需要删除第一个else
块中的return
语句 . 此外,如果bind()
成功,则第二个else
块在调用freeaddrinfo()
之前调用return
,因此您还需要修复它 .试试这个:
话虽这么说,你的 class 在整体清理方面做得并不好 . 我会建议更像C的东西(使用RAII,在错误上抛出异常等):