网络非正常断开重连问题(100分)

  • 主题发起人 主题发起人 tty0819
  • 开始时间 开始时间
T

tty0819

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端用IdTCPServer,网络非正常断开能用
with AThread,Connection do
begin
try
//收、发操作
except
on E:Exception do
begin
Disconnect;
Terminate;
end;
end;
end;
进行网络处理
其中如果已经运行的过程或函数还在运行,会造成新连接的过程或函数无法运行。另其上次运行过程或函数中未完成的传输数据怎么续传。
望高手指点
 
>>如果已经运行的过程或函数还在运行,会造成新连接的过程或函数无法运行
你确信是这样? 你上面的代码是在每个连接的线程中执行的,怎么会“造成新连接的过程或函数无法运行”?
 
应该有个函数可以检测到非正常断开。公司的局域网哈拨一断开就会有一提示“网络没有连接”。不知道是什么函数检测到的。
 
造成新连接的过程无法运是上异常时没有leavecriticalsection

正在考虑继续传输未完成未传完的数据的情况。

3Q mr0511
 
to 网中戏

uses Wininet

var
dwFlags: DWORD;
CheckNetTypeResult : Boolean;
begin
dwFlags := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY ;
//取得网络连接状态
CheckNetTypeResult:=InternetGetConnectedState(@dwFlags, 0);
if CheckNetTypeResult then
//联网
else
//未接入网络
 
非常郁闷的问题。
self.adoquery.Close;
self.adoquery.SQL.Text:='select * from 表';
self.adoquery.Open;
while not self.adoquery.Eof do
begin
ctext.command:=senddata;
ctext.string:=adoquery.FieldByName('name').AsString;;
AThread.Connection.WriteBuffer(ctext,sizeof(ctext)); //发送记录
AThread.Connection.ReadBuffer(ctext,sizeof(ctext)); //确认已收到
Application.ProcessMessages;
self.adoquery.Next;
end;

ctext.command:=sendover;
AThread.Connection.WriteBuffer(ctext,sizeof(ctext)); //发送结束传送
--------------------------------
比如说记录有100条,有时能正常传完,有时只传了几条,就会结束循还,直接发送了结束传送的情况。
 
我没具体测试过,也没看过indy的有关源码,我只是根据理解有这么一说。
但刚才大致跟了一下源码,似乎也没看到临界区的代码。
我简单测试了一下(客户端向服务端发送一串字符,进入服务端代码端点,此时强行终止客户端程序,另一个客户端连接,发送/接受字符),也没出现你说的情况。
 
看了你贴上的循环发送的代码,应该不是临界区的问题,如果临界区问题那就整段代码都不能运行了。应该是你的其他处理逻辑的问题
 
没有其它代码。就只那段,问题是发送的记录有时怎么循环明明没有完成,就结束循环,发送了结束传送数据。
 
ctext的定义可能有问题,建议把ctext.string定义成固定长度的字符数组
如array[0..255] of char;
 
to maze
type
Rcommandtext=record
command:integer;
param1:string[100];
end;
如果有问题,那有时怎么能传完,有时又不能呢。
 
后退
顶部