2011-03-28 3 views
1

Je suis en train de porter linux app sous win32 (msvc 9.0) et après l'avoir terminé, je rencontre un comportement non-par défaut sur des choses simples comme socket().Comment créer un socket via socket() sur MSVC?

#include <winsock2.h> 
#include <ws2tcpip.h> 

int main(int argc, char **argv) 
{ 
    int subsock; 
    if ((subsock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { 
     printf("Failed to open socket (ret value = %d)\n", subsock); 
    } 
} 

Cette imprime Failed to open socket (ret value = -1) chaque fois. Quel est le problème et comment ouvrir socket sur win32?

Répondre

3

Vous devez appeler WSAStartup pour initialiser winsock avant que les appels de socket suivants aboutissent.

WORD wVersionRequested; 
WSADATA wsaData; 
int err; 

/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */ 
wVersionRequested = MAKEWORD(2, 2); 
err = WSAStartup(wVersionRequested, &wsaData) 
if (err != 0) 
{ 
    YourError! 
} 
else 
{ 
    // success 
} 

Pour plus de détails:

http://msdn.microsoft.com/en-us/library/ms742213%28VS.85%29.aspx

Juste demande la version 2.2 et être fait avec elle.

+0

Merci, vous m'avez vraiment aidé avec ça! – DinGODzilla

+0

Je suppose que lors de la compilation de code à la bibliothèque dynamique, WSAStartup() doit être placé dans DllMain(). Est-ce exact? – DinGODzilla

+0

Il est vraiment dangereux de mettre du code dans DllMain - en particulier lorsqu'il s'exécute dans une autre DLL. Ayez juste une fonction d'aide dans votre code qui suit si WSAStartup a été appelé avec une variable globale (et appelle WSAStartup si nécessaire). Juste avant de créer une socket ou toute autre fonction réseau, appelez votre fonction d'assistance. – selbie