精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>Delphi 网络编程>>Delphi ClientSocket控件用SendText发送数据包问题

主题:Delphi ClientSocket控件用SendText发送数据包问题
发信人: 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]

[关闭][返回]