Не удается создать сокет в 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;
}