社区
Linux/Unix社区
帖子详情
在一个TCP连接完成后进行通信,如何判断对方已经关闭了?
deeploves
2006-08-14 03:59:19
我accept接收一个连接后进入一个while(1)循环中,如何在这个循环中知道对方关闭或崩溃退出这个死循环到外循环,重新accept?
...全文
532
6
打赏
收藏
在一个TCP连接完成后进行通信,如何判断对方已经关闭了?
我accept接收一个连接后进入一个while(1)循环中,如何在这个循环中知道对方关闭或崩溃退出这个死循环到外循环,重新accept?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pottichu
2006-08-17
打赏
举报
回复
1
(资本家) 正解!
在对方拔掉网线,或者网络不稳定这种情况,
通过read, recv 都不能检查到 Socket是否已经关闭。
必须发心跳包。
shunek1
2006-08-16
打赏
举报
回复
1
检测连接是否"真正"断开,没有第二条路可走, 客户机和服务器之间必须建立心跳机制, 虽然在read或者write的时候可以判断连接是否"优雅的"断开,但是, 如果直接拔网线或者异常断电等情况的时候,TCP/IP是不会告诉你的, 检测心跳包, 当服务器长时间无法接收心跳包, 可以认定客户端已经死了, 检测心跳的做法也是必需的常规手段.
universes
2006-08-16
打赏
举报
回复
1
呵呵,确实资本家说的才是彻底的解决方法。
我做过一个类似的:
结合资本家说的(我称作keepalive机制)和select,检测对端是否还“存活”
playmud
2006-08-16
打赏
举报
回复
资本家说得好
DanXer
2006-08-15
打赏
举报
回复
答案是select 或pselect 调用。
这是发送,看socket是否可以发送,可以则发送,不可以则尝试直到ntimeout秒后。
fd_set wfds;
FD_ZERO(&wfds);
FD_SET(socket,&wfds);
struct timeval tmout;
tmout.tv_sec=ntimeout;
tmout.tv_usec=0;
int nselect=select(1024,NULL,&wfds,NULL,&tmout);
if(nselect==-1)
{
//select调用错误,报告错误,一般通过errno
}
else if(nselect)
{
//可写进行发送(网络物理和传输链路OK)
int sret;
sret=send(socket,....);
if(sret==-1){
//Send出错,检查或报告错误,一般通过errno
}
}
else
{
//不可写,连接问题,检查或报告错误,一般通过errno
shutdown(socket,SHUT_RDWR);
close(socket);
}
这是接收部分,同发送过程基本相同,除了rfds的位置。
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(socket,&rfds);
struct timeval tmout;
tmout.tv_sec=ntimeout;
tmout.tv_usec=0;
int nselect=select(1024,&rfds,NULL,NULL,&tmout);
if(nselect==-1)
{
//select调用错误,报告错误,一般通过errno
}
else if(nselect)
{
//可读,进行接收(网络物理和传输链路OK,且有income数据)
int sret;
sret=recv(socket,....);
if(sret==-1){
//recv出错,检查或报告错误,一般通过errno
}
}
else
{
//不可读,连接问题或无数据可读,检查或报告错误,一般通过errno
shutdown(socket,SHUT_RDWR);
close(socket);
}
fytzzh
2006-08-15
打赏
举报
回复
如果对方已经关闭套节子 read write函数返回-1.配合检查errno的值.
同时会收到sigpipe信号.
计算机网络 传输层
TCP
和UDP协议
传输层协议加
一个
端口号来标识
一个
应用层协议, 展示了传输层协议和应用层协议之间的关系 # 使用
TCP
/IP筛选实现网络安全 防火墙设置与端口 # UDP协议特点和报文格式 UDP是无
连接
的:即发送数据之前不需要建立
连接
...
TCP
连接
状态-如何
判断
一个
TCP
连接
是否可用
在使用
一个
长
连接
的
TCP
时,如果
TCP
服务器端接收到
TCP
的客户端
连接
过来后,接着服务器端的
TCP
节点需要对这个客户端
进行
数据收发,收发时需要
判断
这个SOCKET是否可用用,
判断
方法有多种; 1.linux的5种方法,本人在使用...
java
判断
tcp
连接
断开
连接
_网络
通信
之检测远端
连接
是否断开
连接
判断
对方是否断开
连接
:一、方法层面的实现:1,使用输入流的read方法:输入流的read(byte[] ,int ,int) 方法,表示从当前的通道中读取数据,具体读取到的数据有返回的int值决定;这里的返回值和抛出的异常很重要,...
TCP
连接
的终止
由于
TCP
是
连接
是全双工的,所以每个方向上都必须
进行
单独
关闭
,这原则是当一方
完成
数据发送任务后就能发送
一个
FIN来终止这个方向的
连接
(收到
一个
FIN只意味着这
一个
方向上没有数据流动)。另一方收到
一个
FIN后仍能...
TCP
协议-
TCP
连接
管理
一、
TCP
概述
TCP
协议是
TCP
/IP 协议族中
一个
非常重要的协议。...在
通信
结束后,必须释放
已经
建立的
TCP
连接
。这就好比打电话,通话前要先拨号建立
连接
,通话结束后要挂机释放
连接
。 (2)
TCP
是点对点(一对一)
Linux/Unix社区
23,116
社区成员
74,506
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章