2010-01-05 1 views
8

У меня довольно неприятная проблема. Следующий код просто не будет создавать сокет в Windows; он выходит из строя и отображает сообщение об ошибке. Может ли кто-нибудь кратко объяснить, почему это может быть? Я невероятно смущен и расстроен тем, что что-то настолько простое терпит неудачу. Спасибо.Невозможно создать сокет в Windows

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

EDIT: Кроме того, при печати outerror (errno) просто отображается сообщение «No error».

ответ

11

Вам необходимо позвонить WSAStartup(), прежде чем какие-либо другие функции сокетов будут работать в Windows (и вы должны позвонить WSACleanup(), когда закончите).

+0

Спасибо ... как-то я получаю Winsock работать все это время без использования этой функции. Очень странно. – 2010-01-05 05:24:30

+0

Возможно, вы обычно используете какой-то другой компонент, который должен использовать сокеты и который запускает для вас ... –

2

Jerry Coffin имеет право примерно WSAStartup() и WSACleanup().

Также отметим, что этот код

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

является проблематичным, поскольку SOCKET является тип без знака (unsigned int).

От winsock.h

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

Итак, IMO, лучше заменить эту строку с

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

, даже если это не основная причина.

2

Пример:

#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

для производственного кода, не забудьте 'WSACleanup();' – Wolf

+0

@ Вольф благодарит вас за предложение. Оценил. –