问题标签 [casyncsocket]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 当从静态方法调用非静态 Attach 时,使用 std::packaged_task 对 CAsyncSocket-Detach-socket 任务进行排队会导致编译错误
我正在实现代码,因此我可以在网络连接到达时接受它们,将它们从它们的到达套接字中分离,创建一个 std::packaged_task 任务,将该任务排队在一个双端队列容器中,然后稍后在它们的任务线程中执行这些任务。Bo Qian 在 YouTube 上关于“C++ 线程 #9:packaged_task”的讲座让这一切变得简单,展示了如何做到这一点。
在我的情况下,代码无法编译,因为我的 StartDecode 是一个试图调用非静态 Attach 的静态方法。StartDecode 是一个静态方法,因为 std::bind 用于将“套接字”绑定到任务。'socket' 通常会被传入 StartDecode 方法,但为了使打包任务中的 'future' 正常工作,必须使用 std::bind 提前绑定任何传入的参数。但是一旦 StartDecode 设置为静态,对 CAsyncSocket 的 Attach(非静态)的调用会导致错误 C2352。
如何从静态 MyRxDecode::StartDecode 调用非静态 Attach 方法?有没有办法避免将套接字参数绑定到任务而不使其成为静态?
c++ - 在网络外的 PC 中配置多个 IP 地址时,CAsyncSocket Bind() 失败
我有一台配置了多个 IP 地址并且不在网络中的 PC。
我正在尝试在这台 PC 上使用 CAsyncSocket 运行在 VC++ 上开发的服务器软件。但是Bind()
该软件中的功能总是失败并出现错误WSAEADDRNOTAVAIL 10049
。
但是我发现绑定在以下情况下可以正常工作:
- 当 PC 连接到网络时
- 在 PC 中配置单个 IP 地址时
我无法理解套接字绑定与网络连接和多个 IP 配置的依赖关系。这是 CAsyncSocket 的问题还是在这种情况下有办法处理套接字?
编辑:
这是我用于创建套接字(显式绑定)的代码,非常简单:
请注意,在上面列出的情况下,相同的代码会成功执行。
c++ - CAsyncSocket::OnReceive 未在 DLL 中调用
我有一个需要使用 VC++ CAsyncSocket 进行 TCP 连接的 Qt 程序。我创建了一个dll。包装 CAsyncSocket。
我遇到的问题是 CAsyncSocket::OnRecieve 从未被调用过。
此外,如果我在不等待 OnRecieve 的情况下调用 CAsyncSocke::Recieve,则会收到 WSAEWOULDBLOCK 错误。
当我在自己的 PC 上进行单元测试时,一切正常。当我在客户端机器上尝试时,我遇到了上述问题。连接和发送命令一切正常,我被告知硬件正在发送回复,但没有 OnRecieve 事件。
sockets - 如何确定套接字接口类型
问题的一点背景:
我最近对 Microsoft 和套接字绑定有过一次濒死体验。我正在测试生产代码,其中一台测试 PC 一直失败。我最终建议该函数存在错误,这bind()
是最古老的函数之一。
我提交了错误(请参阅CAsyncSocket Create 的绑定实现在 Visual Studio 的开发人员社区反馈论坛中有一个错误),但被移交给了 Windows 团队(请参阅他们的反馈中心中的“__imp_bind 实现有一个长期存在的情境错误”) ,谁从来没有做过任何事情。
由于我无法调试bind()
,而且微软拒绝提供帮助,经过 2 周的开发工作后,我最终发现,有问题的测试机器启用了 Hyper-V,而我的接口解析代码正在获取这个虚假AF_INET
地址并对其进行解析的真实IP地址。
我不能指望我的客户仅仅为了运行我的软件而关闭不需要的 Hyper-V 功能,因此我需要使我的解析代码更加精细。
我的问题:
我需要做的是能够获取特定地址的详细名称,例如 for ipconfig /all
。我可以看到其他人问过这个问题,比如 Ivan 的如何确定接口名称和 tez 的Linux 获取所有网络接口名称。Ivan 的答案是使用getsockname()
,tez 的答案是使用if_nameindex()
. 其中任何一个都不会返回详细的接口名称,如ipconfig
.
那么,有人知道那会是什么函数调用吗?
sockets - 为任何未知环境选择套接字接口
问题背景:
我的基于 MFC CAsyncSocket 的套接字代码在实验室中工作了很长时间,直到它没有(请参阅如何确定套接字接口类型)。它的设计基于 Microsoft Docs 示例代码,该代码顺序遍历以套接字系列(如 AF_INET、AF_INET6 等)为键的套接字接口的链接列表。通过Remy Lebeau对我的问题的回答,我现在可以列出我的用户可能遇到的任何界面的详细信息。但正如 Remy 指出的那样,那里有很多接口。“Out there” 对我来说相当广泛,因为我的架构是一个dApp(也就是没有服务器),这意味着我不会提前知道我的用户的精确界面环境。这给我留下了一个界面选择设计问题。
我的问题:
当我几乎不了解所有潜在用户的界面环境时,如何选择界面?有像接口这样的潜在指标,Description
或者Friendly Name
我可以使用它来缩小我的选择解析代码。有一个接口结构成员叫IfType
定义,ipifcons.h
其中包含 281 种类型。我也许可以从中选择一个子集。还有一个GetBestInterface
功能,但我不知道它是否会一直有效,或者它的意图是什么。
我正在寻找有关此问题的一些指导。