请教面向连接的socket问题

horsehorse 2001-11-05 11:30:16
加精
面向连接的socket通讯时,如果一方突然掉电,来不及通知另一方,对方怎么知道此socket已经无效?
...全文
137 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
copy_paste 2001-12-09
  • 打赏
  • 举报
回复
听听
horsehorse 2001-11-07
  • 打赏
  • 举报
回复
算了,我看还是自己发心跳消息吧。
wwwunix 2001-11-06
  • 打赏
  • 举报
回复
另:保活分节的时间间隔一般为2小时,不过这个时间可以改变。
wwwunix 2001-11-06
  • 打赏
  • 举报
回复
select( 0, &readSocketSet, NULL, &errSocketSet, &timeout );
的第一个参数为测试的描述字的个数,它的值是要被测的最大描述字加一。
horsehorse 2001-11-06
  • 打赏
  • 举报
回复
设置SO_KEEPALIVE的代码如lurenfu所说,select检测的代码如下:
struct timeval timeout = { 0, 0 };
fd_set readSocketSet;
fd_set errSocketSet;

FD_ZERO( &readSocketSet );
FD_SET( hSocket, &readSocketSet );
FD_ZERO( &errSocketSet );
FD_SET( hSocket, &errSocketSet );

iRet = ::select( 0, &readSocketSet, NULL, &errSocketSet, &timeout );
关机后iRet的返回值还是0,即没有错误。
不知各位还有什么好方法?分不够可以再加,加个0都没有关系。
wwwunix 2001-11-06
  • 打赏
  • 举报
回复
在unix下修改内核参数:tcp_keepidle.
修改这个参数会影响所有用到保活分节的程序。
horsehorse 2001-11-06
  • 打赏
  • 举报
回复
听听课也是好的,请问能不能介绍一下UNIX下的设置?
wwwunix 2001-11-06
  • 打赏
  • 举报
回复
1、哦
2、我知道unix下的设置,windows下我不太清楚。:-(
horsehorse 2001-11-06
  • 打赏
  • 举报
回复
感谢木易兄的热心解答!
在MSDN中对select的第一个参数有如下解释:
nfds
[in] Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.
似乎在Windows环境下设为什么值都可以。
另外“保活分节的时间间隔一般为2小时,不过这个时间可以改变”,不知应该如何设置?
wwwunix 2001-11-05
  • 打赏
  • 举报
回复
1、向掉电的一方发送数据时,可以检测出socket无效。
2、使用SO_KEEPALIVE套接口选项,也可以检测出socket无效。
lurenfu 2001-11-05
  • 打赏
  • 举报
回复
int sockfd, opt, len;
sockfd = socket( PF_INET, SOCK_STREAM, 0 );
opt = 0;
len = sizeof(opt);
setsockopt( sockfd, SOL_SOCKET, SO_KEEPALIVE, &opt, (socklen_t *)&len );
然后填充FD_SET的读和异常,用select读,出错异常会返回。
wwwunix 2001-11-05
  • 打赏
  • 举报
回复
设置SO_KEEPALIVE选项,然后用select读,则返回错误。
horsehorse 2001-11-05
  • 打赏
  • 举报
回复
请问如何使用SO_KEEPALIVE套接口选项?能否具体一点?多谢!

4,358

社区成员

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

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