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

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

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

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

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

iteye_5871
iteye_5871 如果通过读取socket.getInputStream()时,也不行,因为正常情况下server端是不会发报文回来的,这样就需要等待,无法快速判断socket有效;我是需要在处理正常业务逻辑前就能够准确判断socket不可用,而不是处理业务逻辑的时候才抛出异常
大约 8 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐