为啥套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败?
Posted
技术标签:
【中文标题】为啥套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败?【英文标题】:Why will socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) fail?为什么套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败? 【发布时间】:2015-03-30 20:39:17 【问题描述】:这可能与它无关,但我正在努力将旧的 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 位;未尝试过)上运行我的新应用程序时其他任何东西),它总是在这一点上抛出一个错误。为什么?
【问题讨论】:
它给出了什么错误? 你为什么不打电话给WSAGetLastError
?它不仅有最后一个错误,而且该函数与FormatMessage
的组合会将错误作为字符串提供给您。 ***.com/questions/4633410/…
WSAGetLastError()
返回什么?
注意:当你可以得到只有 2 个参数的 UDP 套接字时:socket( AF_INET, SOCK_DGRAM, 0)
。你不需要第三个参数
几年前在 Unix 上进行 90% 的网络编程,却没有看到让所有树木变成森林的单一魔法蘑菇。错误为 10093 - Winsock 未初始化。当你知道它时很明显......并且知道 WSAGetLastError() - 谢谢:-)
【参考方案1】:
您显示的代码本身就可以,但是您没有指定socket()
失败时WSAGetLastError()
报告的错误代码:
返回值 如果没有发生错误,socket 返回一个引用新套接字的描述符。否则,返回 INVALID_SOCKET 值,可以通过调用 WSAGetLastError 来检索特定的错误代码。
这种情况下最可能的错误代码是WSANOTINITIALISED
(10093):
尚未执行成功的 WSAStartup。 应用程序没有调用 WSAStartup 或 WSAStartup 失败。应用程序可能正在访问当前活动任务不拥有的套接字(即尝试在任务之间共享套接字),或者 WSACleanup 已被调用太多次。
由于您正在开始一个新项目,您很可能只是忘记在调用socket()
之前调用WSAStartup()
来初始化Winsock 库。
【讨论】:
以上是关于为啥套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败?的主要内容,如果未能解决你的问题,请参考以下文章