问题标签 [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 投票
2 回答
4418 浏览

c++ - 我的 MFC 套接字代码中的 CAsyncSocket 断言问题和“不正确的参数”错误背后的原因是什么?

我被要求为朋友查看一些代码。(由于 MFC 和很多糟糕的代码,我犹豫了一下,但他赢了……)

这是一个基于对话框的应用程序,它使用CAsyncSocket.

问题体现在一些不间断的调试中断和其他类似的事情上——MFC 宏也存在问题ENSURE()——检查套接字是否为空。所有的问题都发生在 MFC 的深处。

如果在 Vista/XP 中使用主题,一些谷歌搜索显示可能存在资源泄漏,但我认为这不是问题所在。

根据我几个小时的调试,代码非常糟糕,但基本上它正在执行以下操作:

(建立连接时没有问题 - 只有没有连接时才会出现这种情况)

  • 调用 Connect(server, socket) (在派生CAsyncSocket对象上)
  • OnConnect()我们被通知连接不起作用/未连接。
  • 在主对话框/应用程序的窗口计时器内有一个计时器。当定时器事件/处理程序被调用时,我们检查是否连接。
  • 如果我们检测到我们没有连接(OnConnect()不好)然后我们调用CAsyncSocket::Close(),然后调用CAsyncSocket::Create()(没有参数)然后调用CAsyncSocket::Connect(server, port)

请注意,初始调用Connect()之前没有调用Create().

我的第一个真正的问题:

  • 两者有什么区别,为什么Create()需要?(如果我删除它,那么它不再崩溃,但是当我重新建立连接时我也没有连接)

一般问题:

  • 上面的代码设计到底有什么问题?
  • 一般来说,这应该如何工作?

编辑:

我修复了代码,以便所有路径都通过调用Create()then Connect()

我的断言仍然有问题CAsyncSocket::DoCallBack()- 下面代码的最后一行是断言:

如果我逐步完成,那么我会收到消息框:“遇到不正确的论点”

我认为(但不确定)MFC 在我关闭它之后试图回调套接字。它在一个回调方法(DoCallback())中,但我已经调用Close()了套接字。

所以它看起来确实像一个 MFC 问题,除非我应该先取消订阅。

0 投票
2 回答
1750 浏览

c++ - CAsyncSocket::关闭崩溃

嘿,我在 Windows 服务中做一些客户端/服务器的东西。这东西很新。

我遇到的问题是,当我尝试通过服务管理器停止服务时,它崩溃了。我添加了一些 MessageBoxes 代码,以跟踪它们崩溃的位置,我发现当它关闭侦听器套接字时它崩溃了!!!

我尝试将服务作为控制台应用程序运行,并且我自己调用了称为SERVICE__CONTROL__STOP事件的函数,以便我可以轻松地重现错误和调试。但它工作正常。只有当我通过服务管理器停止 Windows 服务时,它才会崩溃

这是一些代码

主要功能

服务处理程序回调函数

OnStop() 函数

编辑:如果建立连接(客户端连接到服务器)并且客户端关闭连接,然后服务停止,则不会崩溃。仅当套接字正在侦听且未接受任何连接或客户端未关闭连接且服务停止时才会崩溃:)

我想它很清楚!

0 投票
1 回答
820 浏览

visual-c++ - VC++ 6.0:为什么 CASyncSocket::GetLastError() 会导致访问冲突?

我正在使用 Visual C++ 6.0。我不确定 Visual Studio 安装的服务包级别,但操作系统是 Win 2K SP4。失败的代码是 DLL 的一部分。

这是代码:

这在我的构建系统上编译没有错误,并且在没有任何一个调用 m_Client 方法失败的情况下执行。当我将此 DLL 移至生产系统(Win 2K,尚不确定服务包级别)时,对 m_Client->Connect() 的调用返回错误,因此它进入 IF 块。CAsyncSocket::GetLastError() 然后调试器打开并报告 0xC0000005 访问冲突。我对这些东西的理解还不够,无法从反汇编中得到任何东西。

我也尝试过 CSocket::GetLastError() 和 m_Client->GetLastError() ,结果相同。

我相当肯定 m_Client->Connect() 失败是因为生产机器上的一些安全策略在开发系统上不存在,但我想获得实际的错误代码,以便帮助 IT 人员缩小他的范围搜索。

我还没有尝试在我的构建系统上强制调用 GetLastError() 以查看是否存在访问冲突。

0 投票
1 回答
1758 浏览

cocoa - 异步套接字和“静默”断开连接

我一直在使用 cocoaasyncsocket 作为使用 asyncsocket 的 Windows .net 服务器的客户端。我正在使用 ProtocolBuffers 对消息进行编码。这些共同构成了一套很棒的工具。

但是最近我注意到,如果我让客户端长时间连接到服务器 - 好几个小时 - 当我尝试请求数据时,消息似乎已发送但从未到达服务器。我将此称为“无声”断开连接,因为如果出现网络问题,我没有收到通常的断开连接。

我正在处理以下方法以进行调试,但没有一个被调用:

没有任何通知,我发现调试起来很棘手。服务器同样没有显示任何断开连接。

谁能指出我如何进一步分析这个方向?

非常感谢。

0 投票
1 回答
800 浏览

multithreading - CAsyncSocket 和线程/进程安全

我有一些使用CAsyncSocket派生类的遗留代码。此类覆盖OnReceive并且它还具有围绕 SendTo 的包装器。代码在一个 dll 中,多个应用程序将在同一台 PC 上使用,所有端口都是硬编码的。

我猜我需要以命名互斥锁(MFC 中的 CMutex)类位的形式提供同步,我不确定。

我应该在 OnReceive 中锁定一个命名的互斥锁,在 CMyAsyncSocket 的 Send 方法中锁定一个不同的命名互斥锁吗?

我需要同步还是 MFC CAsyncSocket 会为我做同步?担心在多个进程上访问套接字。

0 投票
0 回答
392 浏览

c++ - 在不同计算机上时 MFC 服务器/客户端超时

我有一个使用 Winsock 用 MFC 编写的客户端和服务器。它们仅在它们位于同一台计算机上(即“127.0.0.1”)时才起作用,但是一旦我尝试从另一台计算机连接客户端,我就会收到错误代码 10060,这是一个超时错误。我不确定这是否相关,但是一台计算机连接到域(它是学校计算机),另一台位于工作组下,因此不确定这些是否导致问题。这是一些代码,服务器对象链接到我从 CSocket 派生的类。

客户

服务器

服务器接受功能

0 投票
1 回答
1066 浏览

c++ - 什么时候关闭 CAsyncSocket 是安全的?

CAsyncSocketCAsyncSocket如果我在调用之后Connect但在OnConnect调用回调 之前删除了我的应用程序,则会导致我的应用程序崩溃。ASSERT(pSocket != NULL)失败CAsyncSocket::DoCallBack并且应用程序退出。

换句话说,如果我创建一个CAsyncSocket,尝试将它连接到服务器,然后在连接成功或失败之前将其终止,我就会遇到问题。OnConnect我可以通过实现和设置一个指示连接尝试完成的标志来避免这种特殊的崩溃。如果标志为假,我知道删除它是不安全的。

在删除对象之前,我还需要检查其他情况吗?有没有一种方法可以检查它是否安全?或者我是否需要为我可能启动的任何操作(OnReceive, OnSend, OnConnect)实现所有回调并确保已调用这些回调?

0 投票
1 回答
191 浏览

c++ - C ++停止CAsyncSocket将单个大数据包拆分为多个小数据包

我正在编写一个连接到服务器的客户端

有时,服务器会向客户端发送大小为 30kb 的圆顶特殊数据包,但在客户端,我在多个较小的数据包(1kb)中得到 30kb,所以我的OnReceive回调调用了近 30 次,直到我得到完整的数据包。

我设法解决了这个问题,方法是在一个数据包Sleep(1000)之前放一个CAsyncSocket::Receive,然后我将所有 30kb 放在一个数据包中,但是放Sleep()一个非常糟糕的主意。

有什么我应该做的配置CAsyncSocket吗?

0 投票
1 回答
371 浏览

c++ - 访问已传递给线程的套接字

我是 MFCCWinThread和的新手CAsyncSocket,并尝试通过基于对话框的应用程序自己学习它们。
这是我想要做 的:制作服务器/多客户端模型:当客户端数量连接到服务器时,服务器将根据客户端数量创建线程并通过套接字连接到线程。我已经参考了这篇文章来传递: https: //support.microsoft.com/en-us/kb/175668

我已经成功地在每个连接上创建线程,但是......
我的问题是:我可以从主窗口(GUI)重新访问已传递给线程的所有套接字以向所有客户端发送(广播)数据吗?

这就是我传递的方式:
在服务器端:


注意:m_Listener是派生自CAsyncSocketCSocketThread派生自的类的对象CWinThread
在线程标题内,我添加了 2 行:

在线程类 .cpp 中:



有人可以告诉我接下来要做什么将数据发送到这些套接字吗?

0 投票
1 回答
157 浏览

c++ - 使用 CAsynSocket,如何捕获套接字操作的退出代码?

请有人帮助我如何从 CAsyncSocket 类中捕获套接字操作的错误。

如果我这样做:

它总是返回错误,即WSAEWOULDBLOCK,对于 send()、connect() 等其他操作也是如此。
根据 MSDN,这不是致命错误,并且必须经过一段时间才能完成操作。

那么我如何才能真正检查我的程序每次正确执行 recv() 或 send() 时呢?