2010-01-05 30 views
8

Tengo un problema bastante embarazoso. El siguiente código simplemente no creará un socket en Windows; falla y muestra el mensaje de error. ¿Alguien podría explicar brevemente por qué podría ser esto? Estoy increíblemente confundido y frustrado de que algo tan simple esté fallando. Gracias.No se puede crear socket en Windows

int sock; 
if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
{ 
    printf("error opening socket"); 
} 

EDITAR: Además, imprimir strerror (errno) simplemente muestra "Sin error".

Respuesta

11

Debe llamar al WSAStartup() antes de que cualquier otra función de socket funcione en Windows (y se supone que debe llamar al WSACleanup() cuando haya terminado).

+0

Gracias ... de alguna manera he estado recibiendo winsock a trabajar todo este tiempo sin usar esa función. Muy extraño. –

+0

Probablemente esté usando algún otro componente que necesite usar sockets y que esté haciendo el inicio para usted ... –

2

Jerry Coffin tiene razón sobre WSAStartup() y WSACleanup().

También tenga en cuenta que este código

if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 

es problemático porque SOCKET es un tipo sin signo (unsigned int).

De winsock.h

/* 
* This is used instead of -1, since the 
* SOCKET type is unsigned. 
*/ 
#define INVALID_SOCKET (SOCKET)(~0) 
#define SOCKET_ERROR   (-1) 

Por lo tanto, la OMI es mejor para reemplazar esa línea con

if(INVALID_SOCKET == (sock = socket(AF_INET, SOCK_STREAM, 0))) 

incluso si no es la causa raíz.

2

Un ejemplo:

#include <Windows.h> 
#include <stdio.h> 

#pragma comment(lib,"ws2_32.lib") 

int _cdecl main(){ 
    WSADATA Data; 
    int socket; // or you can use SOCKET socket 
    WSAStartup(MAKEWORD(2, 2), &Data); // 2.2 version 
    socket = socket(AF_INET, SOCK_DGRAM, 0); 
    if(udep_socket<0){ 
     printf("Error Creating Socket"); 
    }else{ 
     printf("Successfully Created Socket"); 
    } 
    system("pause"); 
    return 0; 
} 
+0

para código de producción, no olvide 'WSACleanup();' – Wolf

+0

@Wolf gracias por su sugerencia. Apreciado. –

Cuestiones relacionadas