标签: casyncsocket

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

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

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

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

c++ sockets windows mfc casyncsocket

7
推荐指数
1
解决办法
766
查看次数

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

我被要求为朋友查看一些代码.(由于MFC和许多糟糕的代码,我正确地犹豫了,但他赢了......)

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

问题表现在一些不间断的debugbreaks和其他类似的事情 - MFC ENSURE()宏也有问题- 检查套接字是否为null.所有问题都发生在MFC的深处.

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

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

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

  • 调用Connect(服务器,套接字)(在派生CAsyncSocket对象上)
  • OnConnect()我们被通知连接不起作用/没有连接.
  • 在主对话框/应用程序的窗口计时器内有一个计时器.当调用timer event/handler时,我们检查是否已连接.
  • 如果我们检测到我们没有连接(OnConnect()不好)那么我们打电话CAsyncSocket::Close(),然后打电话CAsyncSocket::Create()(没有参数)然后打电话CAsyncSocket::Connect(server, port)

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

我的第一个真实问题:

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

一般问题:

  • 上面的代码设计究竟出了什么问题?
  • 这应该如何运作?

编辑:

我固定的代码,这样,所有的路径经过呼吁Create()然后Connect().

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

void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)
{
    if (wParam == 0 && lParam == 0)
        return;

    // Has the socket be closed - lookup in dead …
Run Code Online (Sandbox Code Playgroud)

c++ sockets mfc casyncsocket

5
推荐指数
1
解决办法
4203
查看次数

标签 统计

c++ ×2

casyncsocket ×2

mfc ×2

sockets ×2

windows ×1