C++ 为什么套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败?

C++ 为什么套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败?,c++,sockets,mfc,C++,Sockets,Mfc,这可能与此无关,但我正在努力将一个旧的MFC应用程序转换为Unicode。我想我可能会尝试使用Unicode字符集制作另一个全新的MFC应用程序,只是为了让我的头脑清楚一些事情。除此之外,我还需要一个小工具来使用UDP与PLC进行通信,所以我想我应该使用它作为测试用例 所以新的MFC Unicode应用程序运行良好。。。直到我从旧应用程序中剪切并粘贴以下内容: if ( ( mySocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) == IN

这可能与此无关,但我正在努力将一个旧的MFC应用程序转换为Unicode。我想我可能会尝试使用Unicode字符集制作另一个全新的MFC应用程序,只是为了让我的头脑清楚一些事情。除此之外,我还需要一个小工具来使用UDP与PLC进行通信,所以我想我应该使用它作为测试用例

所以新的MFC Unicode应用程序运行良好。。。直到我从旧应用程序中剪切并粘贴以下内容:

if ( ( mySocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) == INVALID_SOCKET )
{
    throw std::string( "Failed to open UDP socket" );
}
当旧应用程序部署在使用VisualStudio2005或2010编译的WinXP、Win7(32位或64位)或Win8上时,这一行从未引起过问题


但我进行Unicode转换的动机是Visual Studio 2013。我将其作为Win32目标进行编译,它可以很好地编译,但是当我在Win7或Win8上运行我的新应用程序时(都是64位的;没有尝试过其他任何操作),它总是在此时抛出错误。为什么?

您显示的代码本身没有问题,但您没有指定失败时报告的错误代码:

返回值
如果没有发生错误,套接字将返回引用新套接字的描述符。否则,将返回无效的_SOCKET值,可以通过调用WSAGetLastError来检索特定的错误代码

这种情况下最可能的错误代码是(10093):

尚未执行成功的WSAStartup。
应用程序未调用WSAStartup或WSAStartup失败。应用程序可能正在访问当前活动任务不拥有的套接字(即,尝试在任务之间共享套接字),或者调用WSACleanup的次数太多


由于您正在启动一个新项目,很可能您只是忘记在调用
socket()
之前调用初始化Winsock库

它给出了什么错误?为什么不调用
WSAGetLastError
?它不仅有最后一个错误,而且该函数与
FormatMessage
的组合将错误作为字符串显示。
WSAGetLastError()
返回什么?注意:当您可以获得只有2个参数的UDP套接字时:
socket(AF\u INET,SOCK\u DGRAM,0)
。您不需要这样做,因为很多年前,90%的网络编程都是在Unix上进行的,并且没有看到使所有树都变成森林的神奇蘑菇。错误为10093-Winsock未初始化。当你知道这一点时,你就会明白。。。并了解WSAGetLastError()-谢谢:-)