Не удается создать сокет в Windows

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

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

EDIT: кроме того, печать strerror (errno) просто показывает "нет ошибки".

3 ответов


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


Джерри Гроб о 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)) )

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


Пример:

#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;
}