如何检测socket端口的关闭

tsjhui 2001-07-02 02:14:35
我用socket建立了网络连接。服务端需要检测客户端状态,如果客户端已经关闭了服务方要进行端口关闭.
1.客户端程序退出了如何检测。
2.客户端主机忽然关闭了如何检测。
...全文
459 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
davidking 2002-06-10
  • 打赏
  • 举报
回复
除非接管底层的驱动程序,否则对于一些异常情况是没法子的
tpProgramer 2001-08-25
  • 打赏
  • 举报
回复
如果不是异步模型呢? 有办法吗?
xlqin 2001-07-02
  • 打赏
  • 举报
回复
通过UDP联接就没办法了吧?
caiyi9000 2001-07-02
  • 打赏
  • 举报
回复
最简单的办法是:
服务器端软件用WSAAsyncSelect模型,然后在响应CLOSE事件的OnClose(SOCKET pSock)函数中做相应处理,其中pSock是当初OnAccept()里创建的用与此客户端通信的socket。
相关代码如下:

#define NETWORK_EVENT USER_MESSAGE+100 //定义网络事件

//自己定义消息映射函数,将上面定义的网络事件映射到处理函数
//OnNetEvent为网络事件处理函数,它在下面定义
ON_MESSAGE(NETWORK_EVENT, OnNetEvent);

//在你应用程序的初始化代码中调用下面的初始化网络的子函数
BOOL InitNetwork() //初始化网络
{
//初始化TCP协议
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
MessageBox("初始化套接字失败!");
return FALSE;
}

//创建服务器端套接字
SOCKET serverSocket
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serverSocket == INVALID_SOCKET)
{
MessageBox("创建套接字失败!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}

//绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(1688);
localaddr.sin_addr.s_addr = 0;
if(bind(serverSocket ,(const struct sockaddr*)&localaddr,
sizeof(sockaddr)) == SOCKET_ERROR)
{
MessageBox("绑定地址失败!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}

//注册网络异步事件,m_hWnd为应用程序的主对话框或主窗口的句柄
WSAAsyncSelect(serverSocket, m_hWnd, NETWORK_EVENT,
FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);

listen(serverSocket, 5); //设置侦听模式

return TRUE;
}

//定义网络事件的响应函数
void OnNetEvent(WPARAM wParam, LPARAM lParam)
{
//调用API函数,得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);

//得到发出此事件的客户端套接字
SOCKET pSock = (SOCKET)wParam;

switch(iEvent)
{
case FD_ACCEPT: //客户端连接请求
{
OnAccept();

break;
}
case FD_CLOSE: //客户端断开事件:
{
OnClose(pSock);
break;
}
case FD_READ: //网络数据包到达事件
{
OnReceive(pSock);
break;
}
case FD_WRITE: //发送网络数据事件
{
OnSend(pSock);
break;
}
default: break;
}
}

OnAccept()
{
SOCKET clientSock = accept(...);
}

OnClose(SOCKET pSock)
{
//做相应处理
}
davidking 2001-07-02
  • 打赏
  • 举报
回复
先检测SOCKET是否可读(可用select)
如可读然后读取数据如果读出的数据长度为0则表示已关闭

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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