客户端跟服务端用winsock API函数连接互相通信,
在服务端里不断地调用一个函数检测是否有可读数据
调用方法是:pub_SocketIsRead(socketS;1)
函数定义如下:
function pub_SocketIsRead(s:integer;nUTimeOut:integer ) : integer ;
var
    LocalRead,LocalWrite,Localexcept :  TFDSet ;
    VTime   : TTimeVal ;
    NStatus : longword ;
begin
    VTime.tv_sec := 0 ;
    VTime.tv_usec:= nUTimeOut ;
    FD_ZERO(LocalRead);
    FD_Set(s,LocalRead);
    NStatus := Select(0,@LocalRead,nil ,nil,@VTime);
    if NStatus = SOCKET_ERROR then
        result := -1
    else begin
        result :=  NStatus ;
    end;
end;但当我在客户端用closesocket(socket)时,此函数仍能检测到有可读数据?为什么?
在调用closesocket(socket)之前一切收发信息正常的。
请大家帮忙

解决方案 »

  1.   

    我遇到过这种情况,后来用read返回0来判断的。
      

  2.   

    这是TCP的正常现象,主要是为了防止丢失最后的数据设计的.一个TCP连接A,B两方,
    当A方先调用closesocket,1,A向B发一个FIN IP包,这时意味着A方将不再发出数据,暂时还可以接收数据.
    2,B收到了FIN包,回复一个ACK和一个FIN包,这时B方也不再发出数据.
    3,A接收到FIN包和ACK包,回复ACK包,这时A方进入CLOSE状态.
    4,B接收到ACK包,也进入CLOSE状态.
      

  3.   

    楼主的Select并不是只受数据到达事件触发吧...
      

  4.   

    to:sy179
    "用read返回0来判断的"即是怎么操作?我的例子里 result :=  NStatus ;返回的就是>0的值to: halfdream
    A方先调用closesocket,B方仍然可以收到N条数据,不止一条
      

  5.   

    to: halfdream
    A方先调用closesocket,B方仍然可以收到N条数据,不止一条,且内容是一样的,就是最后发的那些
      

  6.   

    用read过程来读取接收到的数据,我说的返回0即是read函数的第三个参数。
    HRESULT Read(    void * pv, //Pointer to buffer into which the stream is read
        ULONG cb, //Specifies the number of bytes to read
        ULONG * pcbRead //Pointer to location that contains actual number of bytes read
       );