Не могу создать сокет в Windows - PullRequest
8 голосов
/ 05 января 2010

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

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

РЕДАКТИРОВАТЬ: Кроме того, распечатка strerror (errno) просто показывает «Нет ошибки».

Ответы [ 3 ]

11 голосов
/ 05 января 2010

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

2 голосов
/ 23 декабря 2015

Пример:

#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;
}
2 голосов
/ 05 января 2010

Джерри Гроб прав насчет 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)

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

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

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

...