为什么socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)会失败?

时间:2015-03-30 20:39:18

标签: c++ sockets mfc

它可能与它无关,但我正在努力将旧的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" );
}

在使用Visual Studio 2005或2010编译的WinXP,Win7(32位或64位)或Win8上部署旧应用程序时,该行从未出现过问题。

但是我对Unicode转换的动机是Visual Studio 2013.我将它编译为Win32目标,它编译得很好,但是当我在Win7或Win8上运行我的新应用程序时(64位;避风港' t尝试了其他任何东西),它总是抛出一个错误。为什么呢?

1 个答案:

答案 0 :(得分:2)

您展示的代码本身很好,但是您没有指定WSAGetLastError()socket()失败时报告的错误代码:

  

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

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

  

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

由于您正在开始一个新项目,很可能您在调用socket()之前忘记调用WSAStartup()来初始化Winsock库。