◆◆◆急需解决一个socket循环连接的问题◆◆◆(50分)

  • 主题发起人 主题发起人 yunhuhu
  • 开始时间 开始时间
Y

yunhuhu

Unregistered / Unconfirmed
GUEST, unregistred user!
for i:=1 to 8 do
begin
try
begin
Clientsocket3.Active:=False;
ClientSocket3.Host:='128.64.32.'+inttostr(i);
Clientsocket3.Active:=True;
end;
except
showmessage('Failed');
end;
end;

当第一行为 for i:=1 to 1 do 的时候就可以连接到 128.64.32.1
当第一行为 for i:=2 to 2 do 的时候也可以连接到 128.64.32.2

但是只要循环连接,比如 for i:=1 to 2 do 就一台也连不上,
尝试了每次连接后Sleep(1000);也不行,请教解决的办法,谢谢

blocking方式我也用了,等待时间很长,也连不上,

解决一定给分。
 
ClientSocket3.Open;
while Clientsocket3.Active do
begin
if SleepCnt > 5 then exit;
Inc(SleepCnt);
sleep(1000);
end;
 
大哥,
Sleep是什么意思呢?????
等待呀,程序不会进行任何操作,
你的目的是延时呀,
去看看延时程序吧~~~~~
呵呵~~~~~~~~~~~~~~~~~~~~~~~~~
此问题我建议用线程解决,
呵呵~~~~~~~~~~~~~~~~~~~~~~~~
 
线程怎么做呢,请指点
 
指点一下
 
zhidaoyixia
 
说一下拉
 
首先你这样做,就感觉不正确。 你是想和多个服务器同时建立连接? 还是在任何一个时刻只有一个连接?

如果是同时,需要建立相应个数的clientsock,每个连一个服务器,否则的话只在需要的时候建立连接
 
就是分别连上各个client,client 的onaccept就会有反映,不用同时
 
Clientsocket3.Active:=True;
是异步的,也就是说你只是告诉Clientsocket3去连接,就立刻返回了,返回时连接并不成功,而需要等待一段时间,因为是异步的原因。
这里有两个办法
1:用同步做,不用异步
2:在Clientsocket3.Active:=True;后等待Clientsocket3的连接报告,在往下循环
等待连接报告的方法是不停地调用Application.ProcessMessage,检查标志变量,在Clientsocket3的Connect和Disconnect以及Error中设置标志变量的值
 
ss2000照您的说法,那我的最后一次循环也就是最后一个ip(8那个)应该能够连接,因为时间足够长,可是依然不行哦
 
是可能不行。
你想,程序正在连结上一个IP,可是你突然把IP换了,重新赋值,你说会怎么样?
我也不知道会怎样!什么奇怪的事情都可能发生!
不要在错误的东西上推断正确的东西,那样没有任何意义。
 
哪有没有什么解决的办法呢?
 
不知道,因为你这段代码毫无意义,我不知道你想干什么,当然不知道该如何帮你解决了!
 
想给128.64.32.1到128.64.32.8每台机器发一个消息,让他们分别接到就行
 
别用这种方法,先去PING这些IP,PING通了再连!
 
每个连接一次不就行了。
很麻烦吗??
TCP 就要连接。
UDP就发个广播吧!
 
你同时生成N(8)个,分别去做不就结了,用不着那么麻烦。
for i:=1 to 8 do
begin
try
begin
Clientsocket.Active:=False;
ClientSocket.Host:='128.64.32.'+inttostr(i);
Clientsocket.Active:=True;
end;
except
showmessage('Failed');
end;
end;
 
var
SendList:array[1..8]of TClientSocket;
i:integer;
begin
for i:=1 to 8 do begin
SendList:=TClientSocket.create(nil);
SendList.OnRead:= ;//等于你已经写好的过程
end;
for i:=1 to 8 do
begin
try
begin
SendList.Active:=False;
SendList.Host:='128.64.32.'+inttostr(i);
SendList.Active:=True;
end;
except
showmessage('Failed');
end;
end;

end;
 
后退
顶部