关闭套接字程序崩溃

wxw999 2007-11-21 11:08:31
我用MFC中的套接字类写了一个用TCP通讯的服务器端.和客户端数据通讯等功能一切正常.
当有非法连接后,服务器端的套接字就调用Close函数关闭连接,但此函数一执行就出现异常.在客户端调用Close函数一切正常.其他的函数也都能正常调用.

出现问题的代码如下:
//Cserver是派生于CAsyncSocket的类

Cserver* p33=(Cserver*)lpPara; // lpPara肯定是一个有效的地址

if(p33->IsValid==0 )
{
// 断开,释放
p33->ShutDown(2);
p33->Close(); //*************就是它让程序异常
delete (p33); // 最终目的就是为了释放分配的空间
}

肯请老师帮忙啊
...全文
195 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
A1010101010 2007-11-23
  • 打赏
  • 举报
回复
给我你的信箱,有代码给你
mr.zhoux 2007-11-22
  • 打赏
  • 举报
回复
*lpPara 是个有效的socket么.... 尝试下send去客户端看看是否是有效的 :)
wxw999 2007-11-21
  • 打赏
  • 举报
回复
我调试时跟踪到下面带*的行出现的错误,再往下跟踪就是汇编代码了

void CAsyncSocket::Close()
{
if (m_hSocket != INVALID_SOCKET)
{
VERIFY(SOCKET_ERROR != closesocket(m_hSocket));
CAsyncSocket::KillSocket(m_hSocket, this); //************************
m_hSocket = INVALID_SOCKET;
}
}

另外直接delete套接字,程序也崩溃
an_bachelor 2007-11-21
  • 打赏
  • 举报
回复
void CAsyncSocket::Close()
{
if (m_hSocket != INVALID_SOCKET)
{
VERIFY(SOCKET_ERROR != closesocket(m_hSocket));
CAsyncSocket::KillSocket(m_hSocket, this);
m_hSocket = INVALID_SOCKET;
}
}

應該是VERIFY(SOCKET_ERROR != closesocket(m_hSocket));
這行出錯了
可以調用WSAGetLastError()看下結果

另外p33指向的如果是new出來的一個CAsyncSocket 直接delete就行
解構函數會調用Close(),如果類中的socket句柄有效的話(如果句柄無效會引起VERIFY(SOCKET_ERROR != closesocket(m_hSocket));出錯)
an_bachelor 2007-11-21
  • 打赏
  • 举报
回复
KillSocket可以繼續跟蹤的 就在同一個文件中

void PASCAL CAsyncSocket::KillSocket(SOCKET hSocket, CAsyncSocket* pSocket)
{
ASSERT(CAsyncSocket::LookupHandle(hSocket, FALSE) != NULL);

_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;

CAsyncSocket::DetachHandle(hSocket, FALSE);
if (pState->m_hSocketWindow != NULL)
{
::PostMessage(pState->m_hSocketWindow, WM_SOCKET_DEAD,
(WPARAM)hSocket, 0L);
CAsyncSocket::AttachHandle(hSocket, pSocket, TRUE);
}
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧