2010-01-05 6 views
8

J'ai un problème assez embarrassant. Le code suivant ne créera tout simplement pas de socket sur Windows; il échoue et affiche le message d'erreur. Quelqu'un pourrait-il expliquer brièvement pourquoi cela pourrait être? Je suis incroyablement confus et frustré que quelque chose d'aussi simple échoue. Je vous remercie. EDIT: De même, l'impression d'un strerror (errno) indique simplement "No error".Impossible de créer une socket sous Windows

Répondre

11

Vous devez appeler WSAStartup() avant que toutes les autres fonctions de socket fonctionnent sur Windows (et vous êtes censé appeler WSACleanup() lorsque vous avez terminé).

+0

Merci ... de toute façon je reçois des winsock de travailler tout ce temps sans utiliser cette fonction. Très étrange. –

+0

Vous utilisez probablement généralement un autre composant qui a besoin d'utiliser des sockets et qui fait le démarrage pour vous ... –

2

Jerry Coffin a raison sur WSAStartup() et WSACleanup().

Notez également que ce code

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

est problématique car SOCKET est un type non signé (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) 

Ainsi, l'OMI il est préférable de remplacer cette ligne avec

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

même si ce n'est pas la cause.

2

Exemple:

#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

pour le code de production, n'oubliez pas 'WSACleanup();' – Wolf

+0

@Wolf merci pour suggestion. Apprécié. –