请教面向连接的socket问题

horsehorse 2001-11-05 11:30:16
加精
面向连接的socket通讯时,如果一方突然掉电,来不及通知另一方,对方怎么知道此socket已经无效?
...全文
115 点赞 收藏 13
写回复
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套接口选项?能否具体一点?多谢!
回复
发动态
发帖子
通信技术
创建于2007-08-27

3956

社区成员

通信技术相关讨论
申请成为版主
社区公告
暂无公告