Hier ist meine erste Frage in dieser großen Website.Winsock Fehler 10022 in hören
Ich bin ein einfacher Server zu schreiben, zu erhalten die Portnummer des Benutzers bilden:
#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;
}
.....
ich den Fehler 10022 erhalten, wenn Funktion aufrufen hören, und ich kann nicht das ungültige Argument sehe ich vorbei bin auf die Funktion.
Wenn die Fehlermeldung von dem 'hören()' dann sieht es aus wie Ihre 'socket()' Aufruf: wie (mit RAII, werfen Ausnahmen auf Fehler, usw.) - ich würde etwas mehr C++ vorschlagen 'socketbind()' führt eine Rückgabe aus, so dass 'bind()' nie aufgerufen wird. https://msdn.microsoft.com/en-us/library/windows/desktop/ms739168(v=vs.85).aspx WSAEINVAL bedeutet, dass der Socket nicht mit bind gebunden wurde. –