2011-03-28 104 views
1

我在win32(msvc 9.0)下移植linux应用程序,并且在最终完成之后,我在socket()这样的简单事情上遇到了非默认行为。如何通过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); 
    } 
} 

此打印Failed to open socket (ret value = -1)每次。什么是错的,以及如何在win32上打开套接字?

回答

3

在后续套接字调用成功之前,您需要调用WSAStartup来初始化winsock。

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 
} 

有关详细信息:

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

只是要求2.2版,并用它做。

+0

谢谢,你真的帮了我这个! – DinGODzilla 2011-03-28 00:56:20

+0

我假设编译代码到动态库时,WSAStartup()必须放在DllMain()中。那是对的吗? – DinGODzilla 2011-03-28 01:51:46

+0

将代码放入DllMain是非常不安全的 - 特别是当它在另一个DLL中运行时。在你的代码中只需要一个帮助函数来跟踪WSAStartup是否被全局变量调用(如果需要的话调用WSAStartup)。在创建套接字或任何其他网络功能之前,请调用您的帮助函数。 – selbie 2011-03-28 02:16:54