我需要用ClientSocket与服务器连接进行通讯.代码大概是这样的:  
TClientSocket  *  ctskt=NULL;  
ctskt  =  new  TClientSocket(NULL);  
ctskt->Active  =  false;  
ctskt->Address  =  省略;  
ctskt->Port  =  省略;  
 
下面在一个方法里有这样的代码:  
AnsiString  messageinfo  =  "Hello!";  
 
ctskt->Open();  
ctskt->Socket->SendText(messageinfo);  
每次调用这个方法的时候第一次服务器都没有收到消息,但第二次调用就有了,我加了调试代码在Open()和SendText()后,发现第一次调用该方法后该Socket一直是false的,但为什么第二次调用发数据就能收到呢?我用的是CB6,在CB版块没有高手参与,请这边的大虾帮忙解决,在线等待!而且这里面Catch不到任何异常,使用ctskt->Active  =  True;代替Open(),结果一样不行!.....急急急!

解决方案 »

  1.   

    ctskt->Open();  
    ctskt->Socket->SendText(messageinfo);  
    这两句连在一起使用时,是肯定不会发送的,如果你想连接成功就发送,把它放到Connect事件里面发送
      

  2.   

    一時看不出代碼明顯的錯誤, 但ctskt->Open();  在這裹檢查, 等待聯接成功再發送也對
    ctskt->Socket->SendText(messageinfo);
      

  3.   

    因为你采用的可能是ct nonblocking 模式,这是异步模式,程序每次只关心执行,而不关心结果,你open语句执行后,连接并没有建立,clientsocket不关心这个,等结果返回,直接执行下一句,即sendtext,连接建立的速度肯定没有cpu处理语句速度快,所以第一次发送数据就会失败
      

  4.   

    谢谢楼上,我DEBUG后发现程序明明经过了ctskt->Open();这一部,但就是不触发onconnect事件,但实际上好象已经连上了,因为我推出程序的化,会报告socket error 10053正常情况下只有在连接建立但突然中断才会出这样的错误,但就是不触发onconnect事件,我没有办法把数据发出去.郁闷啊!
    ,如果我把该Open(),放到别的地方,就会触发事件.
    另外,我的那个Open()方法调用的地方是一个回调函数,即有可能被多线程调用,这个没影响吧,线程安全我已经考虑到了,请大虾们再帮帮忙.单位要程序很急啊,谢谢大家了.
      

  5.   

    别opn了,那你直接调用connect不行吗?
      

  6.   

    没有connect方法的,请问有没有大虾知道这个问题的.帮帮我啊?先谢了!
      

  7.   

    如同 wangjintu(wangjin) 所说,在异步模式下调open后socket只是启动了tcp连接的握手过程,连接还没有真正建立,需要等到OnConnect事件之后连接才真正建立,这时才可以收发数据如果你非要connect后马上发数据的话,那就采用同步模式
      

  8.   

    bomdy():
    我现在的问题是,我调用了Open()后,一直无法真正建立连接,即ClientSocket的onconnect事件一直无法触发.和平时唯一不太一样的地方是,我调用Open()的函数,是一个被多线程函数调用的回调函数.难道是这个原因,导致onconnect事件不能触发吗?因为我在别的地方(比如一个按狃)调用Open(),都可以触发onconnect事件的........有什么办法解决吗?
      

  9.   

    使用Open()后,再处理一下消息就可以了,

    Application.ProcessMessages;
    sleep(200);
      

  10.   

    不好找原因的话就这样吧
    cltsck.open();
    while True do
    begin
      sleep(10);
      if cltsck.Active=True then
        cltsck.sendtext('The string ......');
    end;
      

  11.   

    yw1621的语句问题在于只有onconnect发生了,cltsck.active才为true,如果在程序中使用while则当前过程无法所回,也就不可能有onconnect。有点像几何中的循环论证,呵呵。
      

  12.   

    我同意bee2518的看法,把ctskt->Socket->SendText(messageinfo);  放到onconnect中去。
      

  13.   

    syl79(),你的方法我也试了,很奇怪,我打印出来了所有 TClientSocket的事件,发现,Open只触发了onconnecting时间,然后就没有了,感觉是连接不成功,因为成功的话应该会有onconnect事件的.难道多线程回调函数里面使用TClientSocket的Open是有问题的吗?,因为我把Open随便放到别的地方,onconnect事件都会触发即连接能成功.很郁闷啊.不知道这里有没有高手尝试一下,看是否会出我这样的问题呢?
      

  14.   

    同意a12345的处理方式,
    cltsck.open();
    Application.ProcessMessages;cltsck.sendtext('The string ......');
      

  15.   

    onConnect是靠消息来触发的,你把这个控件放在线程中调用,就相当于采用了blocking 模式,这时候怎么能够触发呢。
      

  16.   

    我用另外的方法解决了该问题,不过对该问题出现的原因不太理解,主要是对消息机制和线程不太了解。希望wangjintu能帮忙介绍资料,谢谢!谢谢大家,这里结贴!