我第一次用api写一个文件传输,用的是阻塞方式,客户端用户一个线程循环发送,服务端用一个线程循环接收,正常情况下没有问题,但是当我在传输过程中,拔掉客户端网线时,发现服务端线程死了,
我调试发现是   recv(Mysocket, Data, MaxSendBlock, 0) ,阻塞了操作,一直没有返回,难道说客户端已经断开或发生错误了,服务端都不知道吗?我的接收程序如下:        li_RecSize:=1;
        while (li_RecSize>0)  do
        begin
            li_RecSize:=recv(Mysocket, Data, MaxSendBlock, 0);
            if (li_RecSize = SOCKET_ERROR) or (I <= 0) then
                break;
        end      
当客户端出现网络问题时,服务端要怎样才能发现呢?

解决方案 »

  1.   

    没办法,加个
    try
    except
    end;
    试试
      

  2.   

    不行啊,recv它根本就不退出该语句。
      

  3.   

    li_RecSize:=1;
            while (li_RecSize>0)  do
            begin
                li_RecSize:=recv(Mysocket, Data, MaxSendBlock, 0);
                //这是什么东西???,跳出条件。
                if (li_RecSize = SOCKET_ERROR) or (I <= 0) then
                   exit; // or Abort 看看
            end      
      

  4.   

    楼上,不会吧,flashget这样的下载软件,肯定也是阻塞方式的下载吧,如果在传输过程中,服务器关机,客户端程序肯定可以知道吧,有没有人作这样的程序?
      

  5.   

    li_RecSize:=1;
            while (li_RecSize>0)  do
            begin
                li_RecSize:=recv(Mysocket, Data, MaxSendBlock, 0);
                //这是什么东西???,跳出条件。
                if (li_RecSize = SOCKET_ERROR) or (I <= 0) then
                   exit; // or Abort 看看
            end