是这样,A去调用B,然后B会与服务器C建立Socket连接,B给C发送消息,C反馈消息给B,B再返回给A,整个过程都需要同步进行,即等到上一步做完再做下一步。现在B与C建立连接是通过: ClientSocket.Open;来实现的,然后通过ClientSocket.Active是否为True来判断有没有连接上,ClientSocket.ClientType := ctBlocking;
问题是经常会出现未连接上的情况,即B给C发消息时ClientSocket.Active 还是 False;是设置了阻塞型Open方法还是有延时吗?我需要怎样去判断是否已经连接上,然后去发消息。求指教。

解决方案 »

  1.   

    ctBlocking模式下服务端要写多线程代码的。
      

  2.   


    把你的处理流程梳理下,B相对于A来说是服务端是吗?要开一个服务等A来连接,而B相对C来说你的B又是一个客户端是吗?B主动去连接C?你的B这一边是做透明数据转发,不处理任何协议上面的东西?也就是A丢过来是什么你就原样扔给了C?
      

  3.   


    把你的处理流程梳理下,B相对于A来说是服务端是吗?要开一个服务等A来连接,而B相对C来说你的B又是一个客户端是吗?B主动去连接C?你的B这一边是做透明数据转发,不处理任何协议上面的东西?也就是A丢过来是什么你就原样扔给了C?
    B不是服务器,是一个中间数据处理的过程,就是把A传过来的东西做相应的逻辑处理并编成报文发给C,C是服务器。C处理的结果返回B也会做对应的处理解析再传给A。
      

  4.   


    把你的处理流程梳理下,B相对于A来说是服务端是吗?要开一个服务等A来连接,而B相对C来说你的B又是一个客户端是吗?B主动去连接C?你的B这一边是做透明数据转发,不处理任何协议上面的东西?也就是A丢过来是什么你就原样扔给了C?
    B不是服务器,是一个中间数据处理的过程,就是把A传过来的东西做相应的逻辑处理并编成报文发给C,C是服务器。C处理的结果返回B也会做对应的处理解析再传给A。明白你说的意思了,你的网络通讯、协议数据处理是在B,A应该是UI方面的处理??你的B要通知A的话以数据回调的方式(如果B是DLL的话)很容易做到,我需要怎样去判断是否已经连接上,然后去发消息。求指教,你所说的就是一个点对点的网络通讯而已,感觉是你的业务逻辑没处理好。
      

  5.   

    首先谢谢你的回答,A调用B是用到回调,主要是B连接C的时候需要连接上才能往下做,但是经常出现还没连上就做下面的业务了。
      

  6.   

    procedure TCustomWinSocket.DoSetAsyncStyles;
    var
      Msg: Integer;
      Wnd: HWnd;
      Blocking: Longint;
    begin
      Msg := 0;
      Wnd := 0;
      if FAsyncStyles <> [] then
      begin
        Msg := CM_SOCKETMESSAGE;
        Wnd := Handle;
      end;
      WSAAsyncSelect(FSocket, Wnd, Msg, Longint(Byte(FAsyncStyles)));
      if FASyncStyles = [] then
      begin
        Blocking := 0;
        ioctlsocket(FSocket, FIONBIO, Blocking);
      end;
    end;
    看下这段代码,是因为TClientSocket使用的是WSAAsyncSelect通讯模型,ctBlocking设置的SOCKET是否是阻塞,但到你的应用这边是通过向
    TCustomWinSocket = class
    private
        FHandle: HWnd;
    这个FHandle窗口发异步消息来实现的,所以你在连接返回后要做同步等待TClientSocket的active状态或者是等待TClientSocket.FClientSocket.Connected状态,等待过程要你自己实现,等待最好是加超时处理在里面,防止不在线一直停在这里。