客户端同时发送信息的问题

jiejie1986 2008-04-22 10:41:23
我只做9台客户端,但是有2台同时发送信息,服务器端就只处理一个,弄得客户端的程序死掉,是不是我的服务器端的多线程没有做好啊~~~~
procedure Tnetquery.execute; //线程
var
hICMPdll: HMODULE;
IPOpt:TIPOptionInformation;
FIPAddress:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD;
i:integer;
// ipstr:string;
ipstr:array[0..8]of string;
status:string;
begin
WSAStartup(2,WSAData); //初始化网络协议栈
//************************
//int WSAStarup(WORD wVersionRequested,LPWSADATA lpWSAData);
//[参数]
//wVersionRequested - 要求使用Winsock的最低版本号
//lpWSAData - Winsock的详细资料
//[返回值]
//当函数成功调用时返回0
//失败时返回非0的值
//*************************

hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile'); //取动态库中的导出函数
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP :=IcmpCreateFile;

begin
ipstr[0]:='192.168.1.2';
ipstr[1]:='192.168.1.3';
ipstr[2]:='192.168.1.4';
ipstr[3]:='192.168.1.5';
ipstr[4]:='192.168.1.6';
ipstr[5]:='192.168.1.7';
ipstr[6]:='192.168.1.8';
ipstr[7]:='192.168.1.9';
ipstr[8]:='192.168.1.10';

status:='000000000';
for i:=0 to 8 do
begin
FIPAddress:=inet_addr(pchar(ipstr[i]));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0); //出错语句
pIPE^.Data := pRevData;
MyString := '-------Hello、World!---------------';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 1000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),
@IPOpt, pIPE, BufferSize, FTimeOut);
try
try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
//StatusShow.Lines.Add(pchar(pchar(ipstr[i]))+ '---'
// +IntToStr(pIPE^.DataSize) + '-----' +IntToStr(pIPE^.RTT));
status:=copy(status,0,i)+'1'+copy(status,i+2,8-i);
end;
except
//showmessage('无法连接');
end;
finally
FreeMem(pRevData);
FreeMem(pIPE);
end;
end; //for

comstatu:=status;
databag.timer2.enabled:=true;
fmdesk.edit2.text:=comstatu;
end;
WSACleanup();
end;

procedure Tdatabag.IdTCPServer1Execute(AThread: TIdPeerThread);
var
I:integer;
readstr, scommand:string;
begin
with athread.Connection do
begin
scommand:=readln();
fmdesk.edit1.text:=fmdesk.edit1.text+'sendID:'+copy(scommand,9,4);
//******************************************
if copy(scommand,5,4)='0X01' then
begin
writeln('0X11'+inttostr(length(scommand)));
readstr:=readln();
if readstr<>'ok' then //再次检验发送内容的长度
begin
fmdesk.edit1.text:=fmdesk.edit1.text+'send data error';
scommand:=readln();
if copy(scommand,5,4)='0X01' then
writeln('0X11'+inttostr(length(scommand))); //检验长度发送
readstr:=readln();//返回检验的结果
if readstr<>'ok' then
begin
fmdesk.edit1.text:=fmdesk.edit1.text+'error again';
scommand:='error';
end;
end else
begin
//*****************************************
//if copy(scommand,5,4)='0X02' then //发送网络数据
//begin
// writeln('0X12'+comstatu);
// if readln()='ok' then else
// scommand:='error';
//end else
//begin
//scommand:='error';
//end;
//****************************************
end;
end;
revcommand[commandnum]:=scommand;
commandnum:=commandnum+1;
timer1.Enabled:=true;
end;
end;

procedure Tdatabag.Timer2Timer(Sender: TObject); //处理网络巡查
var
mythread:Tnetquery;
begin
timer2.enabled:=false;
if not mythread.terminated then
begin
mythread:=Tnetquery.Create(false);
//mythread.FreeOnTerminate:=true;
//mythread.Resume;
end;
end;
...全文
57 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiejie1986 2008-04-22
  • 打赏
  • 举报
回复
是我还没有调查清楚,不是线程的原因而是调用完IdTCPServer1Execute跳到timer1的时候,就只有一个可以调用,但是调用完了,其他的客户端就一直是等待了~~~~~
怎么办呢????

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧