CSocket TCP通信,服务器如何知道是哪个客户端断开连接?

时间:2022-09-13 21:43:57
其中有好几个客户端已经连接了,其中一个客户端断开连接了,但是不知道是那个客户端断开的,该怎么判断啊?

服务器内定义了一个套接字数组用于存放客户端的连接,当有客户端连接时,数组加1;有客户端断开时,要把所占用的套接

字空出来。但不知道断开的是哪个客户端。利用客户端的Close();服务器OnClose()响应。。。。。。。

15 个解决方案

#1


服务器端不是和每一个CLient的socket都有个peer socket~

#2


種下你的種子

#3


服务器OnClose();内应该怎么写?

#4


记录你已建立socket 然后再处理 

#5


如果是正常断开,会自动有个close,如果是非正常断开无法判断,除非用定时器定时发测试包

#6


引用 5 楼 work1s 的回复:
如果是正常断开,会自动有个close,如果是非正常断开无法判断,除非用定时器定时发测试包

正解

#7


我也有这个问题

#8


客户端正常断开,那服务器怎样判断是哪个对应的客户套接字断开呢?????

#9


getpeername()

#10


在网络编程中,为了处理非阻塞模式下的数据发送与接收问题,通常是线程与I/O套接字模式合用吧,在IO里面,可以定时判断套接字处于那一种状态,如果判断是FD_CLOSE,就可以知道客户端要断开链接,由于是在线程里面处理这些信息,只要把相应的socket值置空或者关闭就可以了。

#11


当服务器响应客户端的断开响应OnClose()时,在该函数内调用Close();函数,此时对应的客户套接字将会关闭,且套接字的成员变量ClientSocket[i].m_hSocket==INVALID_SOCKET可以判断是哪个对应的客户套接字断开。。。

#12


引用 9 楼  的回复:
getpeername()


这是获得IP地址、端口信息的啊。

#13


引用 11 楼  的回复:
当服务器响应客户端的断开响应OnClose()时,在该函数内调用Close();函数,此时对应的客户套接字将会关闭,且套接字的成员变量ClientSocket[i].m_hSocket==INVALID_SOCKET可以判断是哪个对应的客户套接字断开。。。



这个方法我试过了,管用。还不错,谢谢!

#14


引用 6 楼 maoxing63570 的回复:
[Quote=引用 5 楼 work1s 的回复:]
如果是正常断开,会自动有个close,如果是非正常断开无法判断,除非用定时器定时发测试包

正解
目前只想到了这一种方法

#15


引用 10 楼 yanheifeng715000 的回复:
在网络编程中,为了处理非阻塞模式下的数据发送与接收问题,通常是线程与I/O套接字模式合用吧,在IO里面,可以定时判断套接字处于那一种状态,如果判断是FD_CLOSE,就可以知道客户端要断开链接,由于是在线程里面处理这些信息,只要把相应的socket值置空或者关闭就可以了。


CSocket是阻塞模式的,,,,,

#1


服务器端不是和每一个CLient的socket都有个peer socket~

#2


種下你的種子

#3


服务器OnClose();内应该怎么写?

#4


记录你已建立socket 然后再处理 

#5


如果是正常断开,会自动有个close,如果是非正常断开无法判断,除非用定时器定时发测试包

#6


引用 5 楼 work1s 的回复:
如果是正常断开,会自动有个close,如果是非正常断开无法判断,除非用定时器定时发测试包

正解

#7


我也有这个问题

#8


客户端正常断开,那服务器怎样判断是哪个对应的客户套接字断开呢?????

#9


getpeername()

#10


在网络编程中,为了处理非阻塞模式下的数据发送与接收问题,通常是线程与I/O套接字模式合用吧,在IO里面,可以定时判断套接字处于那一种状态,如果判断是FD_CLOSE,就可以知道客户端要断开链接,由于是在线程里面处理这些信息,只要把相应的socket值置空或者关闭就可以了。

#11


当服务器响应客户端的断开响应OnClose()时,在该函数内调用Close();函数,此时对应的客户套接字将会关闭,且套接字的成员变量ClientSocket[i].m_hSocket==INVALID_SOCKET可以判断是哪个对应的客户套接字断开。。。

#12


引用 9 楼  的回复:
getpeername()


这是获得IP地址、端口信息的啊。

#13


引用 11 楼  的回复:
当服务器响应客户端的断开响应OnClose()时,在该函数内调用Close();函数,此时对应的客户套接字将会关闭,且套接字的成员变量ClientSocket[i].m_hSocket==INVALID_SOCKET可以判断是哪个对应的客户套接字断开。。。



这个方法我试过了,管用。还不错,谢谢!

#14


引用 6 楼 maoxing63570 的回复:
[Quote=引用 5 楼 work1s 的回复:]
如果是正常断开,会自动有个close,如果是非正常断开无法判断,除非用定时器定时发测试包

正解
目前只想到了这一种方法

#15


引用 10 楼 yanheifeng715000 的回复:
在网络编程中,为了处理非阻塞模式下的数据发送与接收问题,通常是线程与I/O套接字模式合用吧,在IO里面,可以定时判断套接字处于那一种状态,如果判断是FD_CLOSE,就可以知道客户端要断开链接,由于是在线程里面处理这些信息,只要把相应的socket值置空或者关闭就可以了。


CSocket是阻塞模式的,,,,,