引起阻塞还有其它的API如:select\send\sendto\revc\revcform等。我个人认为,可以绕过阻塞钩子。用某种方法或信息方式去获取客户端或服务器的状态。然后再去执行这些会阻塞指令。(也可能我的想法不对)
我虽有这种想法,但不知从那里下手。请教高手。

解决方案 »

  1.   

    对于你的第一个问题,你可以做一个线程,称之为Listen线程,他始终在Listening,当他收到一个连接请求后就生成另一个线程来处理这个连接,
    这样做的话就不会是你的程序看起来没有反应。对于你的第二个问题,WinSock为我们提供了2中解决办法,
      1 异步消息选择机制     WSAAsyncSelect
      2 异步事件选择机制
    先声明我只用过第1种方法,如有不明之处,可以继续讨论。
      

  2.   

    to: wisenowa(127.0.0.1)
    异步消息选择机制     WSAAsyncSelect这种方法我也有一点了解,但是做一个listen线程,也可能不必要吧。假如,只打开一个监听,当有连接时再去创建一个线程来处理套间字来处理数据的接收和发送。现在问题就是如何取得客户端的连接请求呢,我试过处于监听状态时,客户端请求连接,服务器会有一个信号。然后再调用accept采不用阻塞。(这是我用控件时发现的,但用api又如何实现呢?这也就是所谓你说的异步事件选择机制)这个WSAAsyncSelect方法我是知道,但不知道怎样去调用。能不能说详细一点。还有wsasetsockopt、wsagetsockopt和ioctlsocket用有什么重大的用处呢?
      

  3.   

    我说一下WSAAsyncSelect吧,我的拙见  他有4各参数
          1, 套接口
          2,接受系统发来的消息的句柄
          3, 消息,就是当某一网络事件发生时产生的消息,有你自己来定义
          4, 你所想要的事件, 如FD_CONNECT等等
      例如
        WSAAsyncSelect(Socket ,Handle, WM_MYSOCKMSG, FD_READ or FD_WRITE);
      参数是随手写来的  然后你就可以在句柄为Handle的窗口中处理WM_MYSOCKMSG消息以及相应的事件
    下面是我的处理过程剪段,看看能否帮助你
    procedure TForm1.WMThreadMsg(var Msg: TCMSocketMessage);
    var
      Str: string;
      RecLen: Longint;
    begin
      case Msg.SelectEvent of
        FD_READ:
        begin
          begin
            RecLen := ReadPacket(pointer(nil)^, -1, Msg.Socket);
            SetLength(Str, RecLen);
            if Readpacket(Pointer(Str)^, RecLen, Msg.Socket) = SOCKET_ERROR then
              ShowMessage('Read Error!')
            else
              ShowMessage(Str);
              SendPacket(Pointer(Str)^, Length(Str), Msg.Socket);
          end;
        end;
        FD_WRITE:
        begin
          if Msg.Socket = FCSock then
          begin
            Str := 'ABCDEFGHIJ';
            if SendPacket(Pointer(Str)^, Length(Str), Msg.Socket) = SOCKET_ERROR then
              ShowMessage('Send Error!')
            else
              ShowMessage('Send OK');
          end;
        end;
      end;
    end;你所说“然后再调用accept采不用阻塞“只是你看到的表面现象,看看类TServerAcceptThread的两个方法就明白了
      

  4.   

    THANK。
    大部分问题己解决。(是指消息方式)
    结账