为啥套接字(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)会失败?的主要内容,如果未能解决你的问题,请参考以下文章

玩转开源Linux C 检测网口热插拔

Socket套接字

求给个windows 下原始套接字的示例程序,要求使用C语言,不使用MFC。

UDP套接字协议

Python开发基础----socket套接字基础2

socket模块__python