问题标签 [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.

0 投票
1 回答
222 浏览

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 方法?有没有办法避免将套接字参数绑定到任务而不使其成为静态?

0 投票
0 回答
181 浏览

c++ - 在网络外的 PC 中配置多个 IP 地址时,CAsyncSocket Bind() 失败

我有一台配置了多个 IP 地址并且不在网络中的 PC。

我正在尝试在这台 PC 上使用 CAsyncSocket 运行在 VC++ 上开发的服务器软件。但是Bind()该软件中的功能总是失败并出现错误WSAEADDRNOTAVAIL 10049

但是我发现绑定在以下情况下可以正常工作:

  • 当 PC 连接到网络时
  • 在 PC 中配置单个 IP 地址时

我无法理解套接字绑定与网络连接和多个 IP 配置的依赖关系。这是 CAsyncSocket 的问题还是在这种情况下有办法处理套接字?

编辑:

这是我用于创建套接字(显式绑定)的代码,非常简单:

请注意,在上面列出的情况下,相同的代码会成功执行。

0 投票
0 回答
606 浏览

c++ - CAsyncSocket 10093 错误

我继承自CAsyncSocket,实现我自己的类。首先,它开始于:

但它显示Create Client socket failed! Errorcode is 10093.

我在网上搜索,显示 10093 是因为:

尚未执行成功的 WSAStartup。

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

然后我修改我的代码

然后运行它,它显示:

图片

我也尝试添加

但它仍然有同样的错误。

0 投票
1 回答
433 浏览

c++ - CAsyncSocket::OnReceive 未在 DLL 中调用

我有一个需要使用 VC++ CAsyncSocket 进行 TCP 连接的 Qt 程序。我创建了一个dll。包装 CAsyncSocket。

我遇到的问题是 CAsyncSocket::OnRecieve 从未被调用过。

此外,如果我在不等待 OnRecieve 的情况下调用 CAsyncSocke::Recieve,则会收到 WSAEWOULDBLOCK 错误。

当我在自己的 PC 上进行单元测试时,一切正常。当我在客户端机器上尝试时,我遇到了上述问题。连接和发送命令一切正常,我被告知硬件正在发送回复,但没有 OnRecieve 事件。

0 投票
1 回答
129 浏览

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.

那么,有人知道那会是什么函数调用吗?

0 投票
0 回答
56 浏览

sockets - 为任何未知环境选择套接字接口

问题背景:

我的基于 MFC CAsyncSocket 的套接字代码在实验室中工作了很长时间,直到它没有(请参阅如何确定套接字接口类型)。它的设计基于 Microsoft Docs 示例代码,该代码顺序遍历以套接字系列(如 AF_INET、AF_INET6 等)为键的套接字接口的链接列表。通过Remy Lebeau对我的问题的回答,我现在可以列出我的用户可能遇到的任何界面的详细信息。但正如 Remy 指出的那样,那里有很多接口。“Out there” 对我来说相当广泛,因为我的架构是一个dApp(也就是没有服务器),这意味着我不会提前知道我的用户的精确界面环境。这给我留下了一个界面选择设计问题。

我的问题:

当我几乎不了解所有潜在用户的界面环境时,如何选择界面?有像接口这样的潜在指标,Description或者Friendly Name我可以使用它来缩小我的选择解析代码。有一个接口结构成员叫IfType定义,ipifcons.h其中包含 281 种类型。我也许可以从中选择一个子集。还有一个GetBestInterface功能,但我不知道它是否会一直有效,或者它的意图是什么。

我正在寻找有关此问题的一些指导。