用ServerSocket时(采用多线程技术),服务端窗口不时弹出窗口“Read error 64 指定的网络名不可再用”。请高手帮忙分析原因。

解决方案 »

  1.   

    不好意思,这两天没上来看,现在将服务断的源码部分贴上来,请大侠们帮我看看,如果我客户端直接关闭程序,就会出现错误“Read error 64 指定的网络名不可再用”,我觉得是客户端SOCKET异常关闭后,服务端没有关闭SOCKET,而继续在该SOCKET上读写,但该怎么处理呢?procedure TMainform.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      SocketThread := TClientThread.Create(False, ClientSocket);
    end;
    Procedure TClientThread.ClientExecute;
    begin
        while Not Terminated And ClientSocket.Connected Do
        begin
          Synchronize(HandleRecvClient);   处理收到的消息
       end;   
    end;   // 处理从前台发来的消息
    Procedure TClientThread.HandleRecvClient;
    var
    i,j:integer;
    ReceiveBuffer : BufferType;
    SocketStream : TWinSocketStream;
    BytesRead : Integer;begin
      try
         if not Assigned(SocketStream) then
         begin
           SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
         end;
         FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0); { initialize the buffer }     { give the client 5 seconds to start writing }
         If SocketStream.WaitForData(5000) Then
           Repeat
             BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
             if BytesRead > 0 then
             begin
               // ..................  
               // 处理接收到的数据
             end
             else
             begin
                 { if can't read in 6 seconds }
                   ClientSocket.Close;     { close the connection }
             end;  // if BytesRead > 0
         Until  Not SocketStream.WaitForData(2000); 
       finally
            SocketStream.Free;
       end;
    end;