如何在MSVC上通过socket()创建套接字?

如何在MSVC上通过socket()创建套接字?,c,visual-c++,sockets,C,Visual C++,Sockets,我正在win32(msvc 9.0)下移植linux应用程序,最终完成后,我在一些简单的事情上遇到了非默认行为,如socket() #包括 #包括 int main(int argc,字符**argv) { 内底壳; 如果((subsock=socket(PF_INET,SOCK_STREAM,0))

我正在win32(msvc 9.0)下移植linux应用程序,最终完成后,我在一些简单的事情上遇到了非默认行为,如
socket()

#包括
#包括
int main(int argc,字符**argv)
{
内底壳;
如果((subsock=socket(PF_INET,SOCK_STREAM,0))<0){
printf(“未能打开套接字(ret值=%d)\n”,子套接字);
}
}

每次打印
无法打开套接字(ret值=-1)
。win32上出现了什么问题以及如何打开套接字?

在后续套接字调用成功之前,您需要调用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
}
有关详细信息:


只需申请2.2版就可以了。

谢谢,你真的帮了我这个忙!我假设在将代码编译到动态库时,WSAStartup()必须放在DllMain()中。这是正确的吗?将代码放在DllMain中是非常不安全的,尤其是当它在另一个DLL中运行时。只需在代码中使用一个helper函数,跟踪是否使用全局变量调用了WSAStartup(并在需要时调用WSAStartup)。在您创建套接字或任何其他网络功能之前,请致电您的助手功能。谢谢。如果我将UNIX src交叉编译到Win32,并且有大量套接字调用,我甚至不知道其中哪一个需要WSAStartup()。然后呢?您可以从DLL中导出一个“Init”函数,并要求使用者调用它。或者只是在DLL和EXE之间订立契约,以便使用者能够提前调用WSAStartup。我想你可以把它放在德莱曼,但这只是一个小小的改动。
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
}