它可能与它无关,但是我正在努力将旧的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 Studio2013。我将其作为Win32目标进行编译,并且可以正常编译,但是当我在Win7或Win8(均为64位;没有尝试其他方法)上运行新应用时,此时总是会引发错误。为什么?

最佳答案

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


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


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


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


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

09-10 03:54
查看更多