发信人: 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]
|
|