linux下如何判断server关闭后socket不可用?

假设在linux上通过杀进程的方式停止socketserver的运行,那么在杀进程前已经建立的socket连接如何判断其已经失效了?
此时判断isClosed为false,isBound和isConnected都是true,而且通过sendUrgentData的方式验证,在windows系统下会抛出异常,可以断定失效,但是在linux下无异常,没办法判断连接失效?想知道在linux下如何判读啊?
测试代码:
Socket socket = new Socket("172.16.132.189", 5656);
socket.setSoTimeout(3000);

    LOG.info("--wait--");
    LOG.info("--do--");
    LOG.info("--isClosed--"+socket.isClosed());
    LOG.info("--isBound--"+socket.isBound());
    LOG.info("--isConnected--"+socket.isConnected());

    socket.sendUrgentData(0xff);
    socket.close();
    LOG.info("--over--");

在执行到LOG.info("--wait--")的时候通过杀进程的方式将sockerserver关闭

3个回答

[quote]8. SO_OOBINLINE

  public boolean getOOBInline() throws SocketException
  public void setOOBInline(boolean on) throws SocketException
  如果这个Socket选项打开,可以通过Socket类的sendUrgentData方法向服务器发送一个单字节的数据[/quote]
你linux服务器SO_OOBINLINE是打开还是关闭的???

aa1aa3
爱上一条鱼 忘了。。。google随便搜一下就有吧 关键字 “sendUrgentData cpu占用”
大约 7 年之前 回复
iteye_5871
iteye_5871 有哪篇文章说过sendUrgentData会导致cpu100%?
大约 7 年之前 回复
iteye_5871
iteye_5871 SO_OOBINLINE是关闭的话,不会引起正常数据通信的混乱,因为发过去的报文不会接收;不过cpu飙到很高倒是有可能,改成这种处理,确实有几次cpu很高不知道原因
大约 7 年之前 回复
aa1aa3
爱上一条鱼 查了下资料 据说。。。。这种方法不可行的。。。。会导致CPU飚得很高,高并发的时候还可能出问题。。。看评论 http://blog.csdn.net/liuzhengkang/article/details/3379982
大约 7 年之前 回复
iteye_5871
iteye_5871 SO_OOBINLINE默认是关闭的
大约 7 年之前 回复

研究得这么深入,对于[quote]此时判断isClosed为false,isBound和isConnected都是true,[/quote]我其实感觉很意外。

试试看getOutputStream()
和getInputStream()会不会抛出异常

iteye_5871
iteye_5871 getOutputStream() 和getInputStream()会抛出异常,但是这样干涉到业务逻辑处理了,我需要在处理业务逻辑前就能够快速的判断socket不可用
大约 7 年之前 回复

Linux操作系统上强行关闭一个服务时,操作系统会发送RST报文给客户端, Java读取数据时,会报连接断开的异常。 你可以尝试在这个链接上read, Java会抛出异常,告诉你链接中断了。

iteye_5871
iteye_5871 如果通过读取socket.getInputStream()时,也不行,因为正常情况下server端是不会发报文回来的,这样就需要等待,无法快速判断socket有效;我是需要在处理正常业务逻辑前就能够准确判断socket不可用,而不是处理业务逻辑的时候才抛出异常
大约 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何判断socket是否关闭?
初学网络编程,想做一个多用户聊天软件。不清楚如何判断客户已经断掉了,服务器端是当有一个连接断开以后出发一个事件么?如何判断SOCKET已经断开呀!rnrn有那位高手作过给个思路!另外有简单多用户聊天的代码可以发一份给我么?rnMAIL:mzwhj1@163.com
如何判断socket已经关闭
重复使用closesocket()同一个socket是否会出错?如何判断一个socket已经关闭了或者是closesocket过了?
关于判断server的socket关闭的问题
client端是用阻塞式监听stdin和远端的socket的,我听说当server关闭socket时client的远端socket会变为可读,可是recv()的内容不可知,我试过用if(recv()==-1)判断,当server关闭连接后client还是分辨是关闭信令还是新信息,请教高手应该如何解决?
tipsWindown 关闭后,输入框不可用
是插件tipsWindown,弹出窗口,操作完,窗口关闭。rn但父窗口中的输入text,均不可输入,什么 问题?rnrn这个问题有时出来,有时不出来,根本找不到规律。rnrn有没有碰到的,如何解决的?rnrn使用:rn var frameUrl = "serviceproduct/type/serviceproducttype_getTypeTreeRadio.action";rn tipsWindown("选择产品类型", "iframe:" + frameUrl, "270", "300", "true", "","true");
如何判断TCP不可用?
[size=14px]在做两台PC通过INTERNET同步数据库的软件。rn由于双方都通过路由上网,是否只能用UDP进行通信呢?rn当存在两台机器在同一局网的时候,通过路由交换数据没有必要,而且也不易实现,那么,怎样判断双方是否可以用TCP/IP连接,还是UDP连接?怎么确定双方是否在同一局网中呢?rn在外网有服务器来提供中断。rn请求指导,谢谢了[/size]
关于linux下关闭socket的问题
如果在客户端,刚刚建立连接的时候,通常要等待很长时间, 如果我在一个线程中连接,另外一个线程中一段时间后用close(sockfd)的办法,能否使连接中断返回,这样做有没有什么不妥之处?
急!!!如何判断对端关闭了socket
我用windows API写客户端程序,连接到别人的服务器,当服务器数据发送回来后,我如何判断服务器是否已经关闭呢,请教各位大虾,谢谢了
如何判断一个socket连接是否关闭?
如何判断一个socket连接是否关闭?
linux下如何判断socket是否有效
建立一个长连接,如果服务端关闭,那么客户端如何知道该连接不可用?rn查找到判断socket长连接是否有效的办法是socket.sendUrgentData,如果不抛出异常就是有效;rn可是测试发现在window下是可以捕获到异常的;但是在linux下无法捕获异常;rn后来发现连续发两次socket.sendUrgentData,如果第二次与第一次间隔时间稍长的话,第二次异常可以捕获,可是这样就影响效率了?谁有更好的办法?rn下面是测试代码:rn Socket socket = new Socket();rn socket.connect(new InetSocketAddress(ip, port));rn LOG.info("--wait--");rn LOG.info("--do--");rn socket.sendUrgentData(0xff);rn socket.sendUrgentData(0xff);rn socket.close();rn LOG.info("--over--");
socket,1000 client如何并发连接server?client是否和server通信后,关闭socket连接?
socket,1000 client如何并发连接server?client是否和server通信后,关闭socket连接?
socket判断远程连接是否关闭
socket类的方法 isClosed()、isConnected()、isInputStreamShutdown()、 isOutputStreamShutdown()但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。使用 Socket的isconnected()方法检测时,滞后是很大的,往往在20秒以上。这不利于系统的实时性。 通过查找发现有一个便利的方法,代码...
LINUX下 判断socket连接状态
如何去判断?有现成函数吗?
如何判断客户端socket连接server不成功?
clientSocket.Connect(IPEndPoint);rnrn现在我要判断connect之后,连接是否成功建立,是用rnif (clientSocket.Connected)来判断,还是用rncatch (Exception ex)来判断?
Socket问题,数据发送完后如何关闭socket
我想在数据发送完成后关闭此socket,该怎么处理?rnrnrn好象下面的代码没有用,数据还未发送就关闭了rnvoid CMyAsyncSocket::OnReceive(int nErrorCode) rnrn static int i=0;rn i++;rn TCHAR buff[4096];rn int nRead;rn nRead = Receive(buff, 4096); rn //处理数据rnrn //发送数据rn int j=Send(buff,4096)rn if (j>=4096)rn rn //关闭连接rn Close();rn rnrn CAsyncSocket::OnReceive(nErrorCode);rnrn
如何强行关闭socket
多个客户端连接到服务器,如何强行关闭服务器端创建的某一个socket?
如何关闭socket连接
用的是tcp连接,但是不知道为什么推出的时候总有线程没有退出来rn代码是这样的rn线程内的代码rnIPEndPoint topip = new IPEndPoint(IPAddress.Parse("192.168.8.22"), 8000);rn Socket topsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);rn topsocket.Bind(topip);rn topsocket.Listen(10);rn while (cut == 1)rn rn topsocket.Accept();rn 下面都是处理代码rn rn rn topsocket.Shutdown(SocketShutdown.Both);rn topsocket.Close();
如何关闭Socket
开启Socket的方法为rn[code=C#] rn//CS为 CreatSocket()函数所在的类的对象 rnprivate void btn_Creat_Click(object sender, EventArgs e)rn rn tryrn rn Thread t = new Thread(cs.CreatSocket);rn t.Start();rn tb_ChatNote.Text += "游戏已建立,等待连接……\r\n";rn myColor = 1;rn rn catchrn rn rn rn //创建端口rn public void CreatSocket()rn rn creatNew = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);rn acceptSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);rn creatNew.Bind(source);rn creatNew.Listen(5);rn acceptSocket = creatNew.Accept();rn t = new Thread(Process);rn t.Start();rn rn private void Process()rn rn tryrn rn while (acceptSocket != null && acceptSocket.Connected)rn rn byte[] buffer = new byte[1024];rn acceptSocket.Receive(buffer);rn if (received != null)rn rn received(Encoding.Default.GetString(buffer));rn rn rn rn catchrn rn rn rn[/code]rn关闭函数如下,但是不能成功rn[code=C#]rn private void btn_Close_Click(object sender, EventArgs e)rn rn tryrn rn cs.CloseConnect();rn rn catchrn rn rn rn //断开连接rn public void CloseConnect()rn rnrn tryrn rn creatNew.Close();rn acceptSocket.Close();rn rn rn rn catchrn rn rn rn[/code]rn rnrnrn请问应如何关闭.
如何完全关闭socket
例:rn SOCKET sock=socket(AF_INET,SOCK_STREAM,0);rn SOCKADDR_IN sa; rn sa.sin_family=AF_INET;rn sa.sin_port=htons(3001);rn sa.sin_addr.S_un.S_addr=inet_addr("191.24.10.11");rn rn bind(sock,(struct sockaddr *)&sa,sizeof(SOCKADDR_IN));rnrn //...... 略rn rn closesock(sock);rnrn如果我把这个程序第一次执行,可正常运行,但是如果再运行一次,则在绑定时发生错误,系统说此IP地址不能重得使用。rn rn 我试了很多的方法,结果只有关机重启才行。呵呵,不过,这不能叫办法。希望有哪位高手指点一二。谢谢rn rnrn
Android如何关闭Socket?
SocketChanel,好像官方有说明,哪个版本有Bug,执行close后,连接还在,除非收发数据,才会报异常,否则连接一种摆在那。rnrn最后官方说明建议用Socket,不要用SocketChanel。rnrn但是,实测不但提到的那个JavaJDK版本有问题,之后的也有问题,不大SocketChanel这样,Socket也这样。rnrn哪位知道怎么断开连接?
如何关闭socket
为什么在sever端收到sever程序关闭之后,假如client端没有关闭,需要等一段时间才能再次绑定socket那?要是在关掉sever程序之前先关掉client端,就可以立即再次绑定。rn已经让sever端退出时关闭socket了啊,请问这是怎么回事??
Socket数据流关闭后怎样使socket不关闭?
本人在写一个用socket传送文件的程序,发送端代码:rnwhile ((i = reader.read(b)) != -1)rn writer.write(b, 0, i);rnrnwriter.flush();rnwriter.close();rnrn不加close的话数据不会完全发送出去,可是关闭后接收端的socket就被关闭了,可是我还想继续接收别的文件,怎么才能不让接收端的socket关闭呢??rn
linux下如何关闭响铃?
最明显的一个情况是,命令全称忘记时按tab键会在主板上发出“比”的一声, rn我想把这个声音关掉,用什么方法? rnrn请教,多谢 !!!!!!
linux下如何关闭nginx
linux下如何关闭nginx   解决方法: 果提示kill 8443: 没有那个进程,没关系,执行ps -ef | grep nginx看看是否已关闭nginx服务 命令:http​://www.yayihouse.com/yayishuwu/chapter/1651...
在Linux下如何关闭显示器??
在window 98/2000的电源管理中可以定时关闭显示器。在linux中有相关的命令或操作吗?
socket连接建立后,如何判断这个socket连接没有通讯?
小弟在写socket的程序,现在遇到一个问题,就是在client socket和server socket通讯过程中,有段时间可能是空闲的,如果空闲时间超过3分钟的话,我(client socket)要发送测试包过去,server socket收到测试包要返回一个测试返回包,如果我没有收到这个返回包,我就当server socket已经失效,我就断开我的socket。rnrn问题:有什么办法可以判断socket链接是空闲的?有现成函数?还是代码?或者我自己去搜索的时候搜索关键字应该是什么?rnrn哪位知道的帮忙给个提示吧,先谢了.rn
SOCKET如何判断类型
在TCP协议下rnSocket A 是监听用的,SOCKET B是用于客户端rnSOCKET C是B连接A后用于与B交流rn有什么办法其中它们的类型?
如何判断SOCKET错误~
在WSAAsyncSelect模型中可以用下面的代码判断socket非法断开,也就是说没有经过closesocketrnrnif(WSAGETSELECTERROR(lParam))rnrnrnrnrn但是我在一般的socket编程中如何来捕获这个事件~~~~~rn没有使用任何模型
如何判断socket的状态
如:rn 我现在client端与server端连接成功了rnrn 后来client发送数据给server端,server端接受完数据之后关闭rnrn 我怎么知道服务端关闭了呢rnrn谢谢
如何判断socket状态??
我用fsockopen打开一个联接rn请问用什么可以判断这个sock的状态rn比如说是否对方已经关闭连接??
如何判断socket断开连接
rnrn除了看recv返回值还有什么好的方法吗?rn以前在windows下方法好多,甚至就连select();都能,getsockopt也行,可是在linux下我试过select不行.rn还有别的方法吗,不知道getsockopt能判断吗,怎么判断。或者有更好的判断方法rn
如何判断SOCKET断开
在非阻塞模式下,服务器端如何知道客户端的SOCKET已经断开,而客户端的SOCKET不是人为断开的,有可能是网络或者客户端系统问题造成的。请高手帮忙解答
如何判断浏览器关闭?
很多的操作共用了一个数据库连接,这样节省每次操作数据库都要打开和关闭一个数据库时间的时间,现在请教的问题是如果判断浏览器关闭以关闭这个共用的数据库连接?
如何判断form关闭?
原意是想从一个属性是normal的form中传一个值到MDIchild的form中的edit里,结果是不行,报地址的错。于是想换种实现的方式,其中要用到判断一个属性是normal的form是否关闭了。。。rn 请问原意中的传值有什么方法可以实现吗?再就是如果判断一个Form是否关闭了或者说一个窗口关闭了,如何从另一个窗口中响应这个事件呢??rn 谢谢
Socket高手指点,如何真正关闭socket?
我的程序需要不停地轮流和多个服务器连接通信,其中就涉及多次关闭和打开套接字。我在读取数据后、读取数据超时(Timer控制)、连接超时(用Timer控制)、OnError和OnDisConnect中都添加了关闭套接字的动作。其中在OnError中是Socker->Close();其它是ClientSocket->Active = false ;但是程序运行一段时间后,ClientSocket->Active 就一直为true 为何?应该如何解决?有没有成功的应用原码参考参考啊?等ing!
Linux下如何判断裸设备
在linux下,如何判断一个分区或者硬盘为裸设备??
用户端关闭socket时如何告知服务器关闭对应的socket?
用户端随时都有可能关闭程序,我想着服务器在干自己的事的同时得时刻监听有没有某个socket需要被关掉...但是如何实现乜?用户和服务器直接要做的正经事就是传输信息啊什么的...如果是用户在关闭前发来某个信息的话...在那么多信息中怎么找到呢?rnrn另:有什么方法可以在程序里当某个条件成立时,自动关闭一个已经打开的JFrame么?
C# Socket 关闭服务,如何关闭当前已经连接的socket
RT。rnrn采用C#rnrn求解决方案rnrn目前server的socket主动close之后,listening没了。但是还有2个ES状态。rnrn说明服务器只是关闭了监听,但是客户端的连接没有主动close。rnrn
如何使窗体的关闭按纽不可用???
有时做项目的时候,需要禁用窗体的关闭按纽,请问这个问题用代码怎么实现?
C# 如何让关闭按纽不可用
我想让一个窗体只能最小化,不能最大化和关闭,请问该怎么做呢?
怎样判断accept()的SOCKET是否已经关闭?
就是我要在交互之后判断由accept()产生的那个SOCKET是否已经在交互过程中关闭,若没有关闭,就关闭。
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件