发信人: kingron() 
整理人: teleme(2000-12-07 21:42:10), 站内信件
 | 
 
 
作 者: iamverygood (↖小鱼儿) 2000.11.11 
 Delphi ClientSocket控件用SendText发送数据包问题!!! 
 
 ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]); 
 ClientSocket.Socket.SendText('ACK'); 
 
   以上两行代码本意是发送Memo控行最后一行字符串之后,紧接着再发送一个'A 
 CK' 
 字符串。控件应分两次即两个不同数据包将其发送出去。但在测试中发现,有一 
 半左右的情况是ClientSocket将其做为一个数据包发送,
 即实际发送的是一个数据包,而该包的内容则是第一个包的尾部跟上ACK。即Mem 
 o控件最后一行+'ACK'。 
    有解决办法的请发妹儿:[email protected] 
    谢谢!!! 
 
 补充几点: 
     
 1. 以上两行代码是由计算机自动发送完成,当我在两行发送代码中加上一个 
 延时的空循环(100000),发送正常,即都是分两个包发送。 
 
 2. for for_i := 0 to 100 do 
     ClientSocket.Socket.SendText('ACKK'); 
 
   服务器端接收到的包只有一个或几个,包的内容不是一个'ACK',而是: 
   'ACKACKACKACKACKACKACKACKACKACKACKACKACKACKACKACKACKACK' 
 
 3. 查看Winsock函数,发现Windows采取了Nagle算法,用选项TCP_NODELAY来更改 
 : 
 
 Var 
   cur_linger:Pchar; 
   cur_char:char; 
   return_value:integer; 
 
 begin 
   cur_char := '1'; 
   cur_linger := @cur_char ; 
   return_value := setsockopt(ClientSocket.Socket.SocketHandle,IPPROTO_ 
 TCP,TCP_NODELAY,cur_linger,sizeof(char));
   return_value := WSAGetLastError(); 
   if return_value <> 0 then showmessage('error'+inttostr(return_value) 
 ); 
 end; 
 
 其返回值为0,即表示成功,但好像无任何作用!!!
  ---------------------------------------------------------------------- ----------
   作 者: iamverygood (↖小鱼儿) 2000.11.11 修改 删除 转贴 打包 回复  
  Delphi ClientSocket控件用SendText发送数据包问题!!! 
 
  ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]); 
  ClientSocket.Socket.SendText('ACK'); 
 
     以上两行代码本意是发送Memo控行最后一行字符串之后,紧接着再发送一个  
 'ACK' 
 字符串。控件应分两次即两个不同数据包将其发送出去。 
     但在测试中发现,有一半左右的情况是ClientSocket将其做为一个数据包发  
 送, 
 即实际发送的是一个数据包,而该包的内容则是第一个包的尾部跟上ACK。即Mem  
 o控件 
 最后一行+'ACK'。 
 
    有解决办法的请发妹儿:[email protected] 
    谢谢!!! 
   
      
 
 -- 
 ※ 修改:.kingron 于 Nov 13 12:26:03 修改本文.[FROM: 61.137.31.2] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.102.58]  
  
 网易9月巨献 ----> 点击进入全新的新新人类广东站  
 
 ---------------------------------------------------------------------- ----------
   作 者: iamverygood (↖小鱼儿) 2000.11.11 修改 删除 转贴 打包 回复  
  补充一点: 
     
    以上两行代码是由计算机自动发送完成,当我在两行发送代码中加上一个 
 延时的空循环(100000),发送正常,即都是分两个包发送。 
 
 
 -- 
 ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.102.58]  
  
 网易9月巨献 ----> 点击进入全新的新新人类广东站  
 
 ---------------------------------------------------------------------- ----------
   作 者: iamverygood (↖小鱼儿) 2000.11.11 修改 删除 转贴 打包 回复  
    For for_i := 0 to 100 do 
     ClientSocket.Socket.SendText('ACKK'); 
 
   服务器端接收到的包只有一个或几个,包的内容不是一个'ACK',而是: 
   'ACKACKACKACKACKACKACKACKACKACKACKACKACKACKACKACKACKACK' 
 
 
 
 -- 
 ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.102.58]  
  
 网易9月巨献 ----> 点击进入全新的新新人类广东站  
 
 ---------------------------------------------------------------------- ----------
   作 者: iamverygood (↖小鱼儿) 2000.11.13 修改 删除 转贴 打包 回复  
  查看Winsock函数,发现Windows采取了Nagle算法,用选项TCP_NODELAY来 
 更改: 
 
 
 Var 
   cur_linger:Pchar; 
   cur_char:char; 
   return_value:integer; 
 
 begin 
 
   cur_char := '1'; 
   cur_linger := @cur_char ; 
   return_value := setsockopt(ClientSocket.Socket.SocketHandle,IPPROTO_  
 TCP,TCP_NODELAY,cur_linger,sizeof(char)); 
   return_value := WSAGetLastError(); 
   if return_value <> 0 then showmessage('error'+inttostr(return_value)  
 ); 
 
 end; 
 
 其返回值为0,即表示成功,但好像无任何作用!!! 
 
 -- 
 ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.102.58]  
  
 网易9月巨献 ----> 点击进入全新的新新人类广东站  
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.102.58]
  | 
 
 
 |