socket应该是由客户端来完成关闭操作的,这个c server设计显然不合理.
好比一个ftp,你正在下载,如果这时候ftp server shutdown了,我想你的下载是立即停止的.
ftp就是一个最好的例证,没有ftp会由server端主动关闭客户端连接吧.
好比ftp shutdown的时候,会提示在用户下在完成后自动shutdown,但是这个时候ftp server会等待客户端发送接受完毕的通知,接到通知后才会关闭,而不是传了最后一个包就关闭.我也做过c和java或其他的的通信问题
至于socket的连接关闭问题一直都是由客户端完成的,服务器只有在超时、异常的情况下才会关闭一句话,解玲还需系玲人,谁请求的连接谁关闭。
有力的资料倒是没有,感觉这是一个常理问题

解决方案 »

  1.   

    我又何尝不知道,只是server端的编写人员不是我的权力能够支使得懂的。
    另一方面由于有两个可以运行的client,(我分析他们的源代码是存在bug的,但是目前很难模拟出来),所以Server端很难更改。
    除非能找出rfc这样的资料。
      

  2.   

    -----
    在返回串比较大的时候是没有问题的,但是返回串比较小的时候,read的时候会发生IOException,并且没有读完。
    ------
    从这句话来看,服务器端会有问题吗?如果有问题,为什么数据量大的时候会没事呢?
    我想问楼主,客户端是单线程的吗?另有多少个客户端?
    还有请把异常信息贴上来。
      

  3.   

    客户端和服务端都是单线程的。(为什么是这样,和具体的业务有关。)客户端的异常信息是“服务器端关闭了一个现有的连接”,谢谢参与。对了,jdk 1.4.02, win socket 1.1
      

  4.   

    为什么数据量大的时候没有问题,因为在客户端读取的时候,我是先读出4个字节的长度,然后读取剩下的内容,当数据量小的时候,win socket将自己的数据copy到tcp的缓存中用的时间少(准确地说仅仅只有一次,注意到只有socket 的 send检查缓存),所以事实上是没有阻塞的,于是closesocket()的时候client并没有来得及读完所有的数据.(更精确的说,在server端send()和closesocket()的时间差小于客户端从第一次read到第二次read结束的时间,当然也可以认为在shutdown(SD_BOTH)的时候并没有完全发送数据出去,数据还在socket的缓存中,也有可能,但是对于这么底层的细节,对于我们来说都是一样的)
    大数据量的时候,由于需要阻赛,于是client端的两次读取的短暂间隙显得微不足道。于是在Server端closesocket()的时候,client端读取已经结束了。
      

  5.   

    这个问题的确不好解决,因为从逻辑上讲java这样处理,也是可以的。
    先不要建议改server部分,需要做进一步的测试,确认问题是由于什么引起的。
    socket会把要发送的先放入缓冲,但还不会发送,只有缓存满了或程序中做了强制发送代码才会真正发到客户端。
    为什么会引起你那样的情况,原因不知道是不是这个引起的,需要进一步测试。
    建议
    1、看看你s端是否有强制发送的代码。
    2、一般再发送协议里还有表示结束的标识,只有发送和收到了这个标识,才断socket。
    3、问题究竟如何引起,需要再测试定位。
      

  6.   

    那样的话,问题已经很清楚了。就是客户端读取的中间,服务器关闭了socket,造成客户端连接异常。解决的办法是:
    1、服务器端接收请求建立一个线程。
    2、服务器发送信息。
    3、客户端接收完毕,发送请求关闭消息。
    4、服务器接收到请求后,关闭socket,并接受线程。
    不用什么强有力的资料了,你的程序就是强有力的证据嘛!
      

  7.   

    回复人: zhang21cnboy(事了抚衣去,不留身与名) ( ) 信誉:100  2004-07-16 13:23:00  得分: 0  
     
     
       你客户端扑获的异常信息呢?
    ======================================  客户端的异常信息是“服务器端关闭了一个现有的连接”,谢谢参与。 
      

  8.   

    各位,很感激你们的回答。Server端的编写者是一个经验丰富的老的c程序员,一般情况下,连接的关闭需要由client端发起。但是现在Server强制关闭socket有它自己的理由。上面我写出了我的那么多分析,我只是希望省去各位替我分析bug的过程,希望的哪位对win sdk 的Socket细节特别熟悉的前辈告诉我一个比较权威的文档或者资料,最好来自M$,来说服别人做改动。msdn我也查了,上面什么细节也没有。本来在VC/MFC我也发了这么一个帖子,可是没有几个人懂JAVA 的nio,反而不如这里反响激烈。 :-(
      

  9.   

    c 客户端在访问c server的时候
    如果c客户端与c server在同一太机器上的时候,它们之间的通信并不是纯网络连接的关系,他们实际上是个本地copy的,在我与我一个同事的c server时发现了这样一个问题,曾经导致过我们一直没有找到c server的问题,将c client放置于其它机器上作多次测试看看那个时候c client会不会出现java client的问题,我想应该会发生的,最好是不在局域网上且,多用户测试,这样更准确
      

  10.   

    我是在局域网上两台机器之间作的测试。
    如果楼上的愿意,可以到
    http://community.csdn.net/Expert/topic/3179/3179652.xml?temp=.2920496
    继续。
      

  11.   

    楼主的需求和我现在做的项目惊人的相似啊!!!我也是c++和java的通信
      

  12.   

    回复人: nwpulipeng(夜听春雨) ( ) 信誉:103  2004-07-21 12:18:00  得分: 0  
     
     
       楼主的需求和我现在做的项目惊人的相似啊!!!我也是c++和java的通信
      
     
    ================================================================
    用java和c++通信最大的心得是:怎么去应付那些看不起java的c程序员。 *_*
      

  13.   

    唉,我做的项目也是C++和java的我做java部分
    顺便问个问题
    如果C++(server端)主动断开连接,java(client端,也可以看作一个小的server端)这边怎么实时得到socket的连接状态,用socket本身的方法判断肯定是不行的,大家都是用write方法发数据包来确认的吗???