我的理解是:
ClientSocket.Open() 并不等待连接建立好,而是立即返回.
所以Open 后的代码在第一次运行时连接一般还没有建立好,因此不能发送数据.
而你响应showmessage至少要用一两秒时间,此时连接一般已经建立好,故可以
发送数据.
连接建立好之后ClientSocket.OnClientWrite()会被调用,你不妨在此发送你
的第一个数据包.

解决方案 »

  1.   

    SoftCrazy:
        感谢你的回答。
        还是有问题,我去掉ShowMessage后,加上了Sleep(1000);这样的话就出现100054错误,不能发数据。
        你说的调用在哪里呢?我Open后,就开始SendText了!
    还有我写的 ClientSocket:=TClientSocket.Create(nil) 注意这个nil,我不知道这样对不对?有没有什么问题?(在dll中,没有Form)
        谢了!
      

  2.   

    工作模式我也设了,在open之后是ClientSocket.ClientType :=cbNoBlocking(异步吧,可能拼错了)但跟踪Active还是False,
    我在水木清华上看到也有一篇类似的文章,他指出是由于没有工作模式,但还提到消息机制,不知如何理解?sunsetyang你也不妨去看看,有什么好的建议一定要赐教啊!呵呵!谢了!
      

  3.   

    cbNoBlocking 非阻塞模式,open后立即会返回,但这时并不表示与服务器建立了联结,只有ClientSocket.OnConnect事件发生后,才表示联结成功,你可以先设立一个通信是否联结的标记,初值为False,在OnConnect中把它置TRUE,在发送数据时判断此标记即可!
      

  4.   

    忘了告诉你,TClientSocket.Create(nil) 没问题的,
    只是你必须在退出时手工Free.
      

  5.   

    yangfan:
     如何动态的写OnConnect事件呢? 还有设置完CbNoBlocking后,如何处理Hook?
      

  6.   

    与hook没什么关系的!在你的form中加入如下procedure
    procedure MySocketConnect(Sender: TObject;
          Socket: TCustomWinSocket);
    procedure MySocketConnect(Sender: TObject;
          Socket: TCustomWinSocket);
    procedure MySocketDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
    procedure MySocketError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure MySocketRead(Sender: TObject; Socket: TCustomWinSocket);Create你的ClientSocket时
    ClientSocket:= TClientSocket.Create(nil);
    ClientSocket.Address := YourServiceIP;
    ClientSocket.OnConnect := MySocketConnect;
    ClientSocket.OnDisconnect := MySocketDisConnect;
    ClientSocket.OnError := MySocketError;
    ClientSocket.OnRead := MySocketRead;
    ClientSocket.Active := TRUE;
    bConnected := FALSE;然后在你的
    procedure MySocketConnect中令 bConnected := TRUE;发送数据时判断bConnected即可。注意在procedure MySocketError 中要将ErrorCode:=0;
    Good Luck!!
      

  7.   

    yangfan:
      问题是我在Dll中,没有Form,有Form的话就简单啦!
      

  8.   

    那你就自己做个从TObject继承来的类把ClientSocket包装起来不就行了吗!!
    在它Create时做上面的初始化工作! 
    如果还有问题email to: [email protected]