当客户端socket关闭时,select模型的server端该如何完美的释放掉连接的socket?

guopo 2008-07-08 09:45:40
首先谢谢各位!

我是希望高人给我提供个服务器端的编程模型。

我的服务器端会接收多个客户端的连接,并接收客户端发来的数据。由于我客户端会频繁的连接和关闭,所以我想在客户端关闭之后,服务器端作相应的处理。我是在每个客户端连接后都加入到一个链表中,并开出一个线程用select来检测连接的socket可读性,如果可读,就接收客户端的数据。

...全文
782 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbjfeng 2009-01-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cnzdgs 的回复:]
FD_ISSET( Socket, &fdRead )是检查Socket是否在fdRead中,与连接是否断开没有关系。
[/Quote]

请恕小弟直言,FD_ISSET应该是判定socket是否可读写吧?
guopo 2008-07-08
  • 打赏
  • 举报
回复
谢谢,我试过了,是这样的。
cnzdgs 2008-07-08
  • 打赏
  • 举报
回复
FD_ISSET( Socket, &fdRead )是检查Socket是否在fdRead中,与连接是否断开没有关系。
guopo 2008-07-08
  • 打赏
  • 举报
回复
cnzdgs: 那么 FD_ISSET( Socket, &fdRead ) 会返回什么?
IsItNothing 2008-07-08
  • 打赏
  • 举报
回复
同意6楼的,再select成功后,判断recv返回值.
cnzdgs 2008-07-08
  • 打赏
  • 举报
回复
如果对方closesocket,select会成功,但recv返回0。可以根据recv的返回值来判断。
IsItNothing 2008-07-08
  • 打赏
  • 举报
回复
如果请求量很大,可以考虑用io完成端口.
客户关闭socket后,服务端这边的select会返回一个错误代码,你可以此时调用closesocket,然后作清除链表的处理,并退出线程.
guanbenben 2008-07-08
  • 打赏
  • 举报
回复
正常关闭还是异常关闭?
这个可以放到协议栈处理
guopo 2008-07-08
  • 打赏
  • 举报
回复
我的意思是说客户端调用了closesocket,服务器端怎么知道客户端关闭了?
jwybobo2007 2008-07-08
  • 打赏
  • 举报
回复
搞不清楼主的意思,直接closesocket不就行了
cnzdgs 2008-07-08
  • 打赏
  • 举报
回复
closesocket就可以了。

18,356

社区成员

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

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