关于clientsocket的高级问题(100分)

  • 主题发起人 主题发起人 zcm1975117
  • 开始时间 开始时间
Z

zcm1975117

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好!
我写了一个向局域网发信息的软件,clietsocket控件,如果一台一台的发,是没有问题的,
但如果用一个循环向多台机同时发时,第一台没有问题,循环到第二台晨,就弹出:windows
socket error:(10022),on API 'WSACancelASynRequest',是什么原因呀?主要程序如下:
//连接远程机器
procedure Tmainform.connectMachine(sip:string);
var
NewItem: TMenuItem;
begin
if ClientSocket.Active then
begin
clientsocket.socket.close;
end;

Server:=sIP;
if Length(Server) > 0 then
with ClientSocket do
begin
try
Host := Server;
Active := True;
Clientsocket.Socket.Lock;
hostlist.Items.Add(server);
hostlist.ItemIndex:=hostlist.Items.Count-1;
{ first create the separator }
NewItem := TMenuItem.Create(Self);
NewItem.Caption := server;
{ add the new item to the Windows menu }
popupmenu3.Items.Add(NewItem);
Panel5.Enabled:=True;
Notebook1.Enabled:=True;
finally
end;
end;
clientsocket.Socket.SendText('remotehostname>>>>'+thismacip.Text);
end;

 
clientsocket.Socket.SendText('remotehostname>>>>'+thismacip.Text);
ClientSocket1.Socket.Unlock;
 
to weekboy:
问题仍然存在,只要TRUE时,就会弹出来!
 
Active := True 换成Socket.open
 
to weekboy:不行,应该两者没有什么关系吧!!!
大家快帮帮忙呀!!!!
 
TO:zcm1975117
Socket有同步和异步两种模式,你使用的是同步会阻塞的那种。使用异步方式好了。
还有给局域网多台机器发信息用发送网段地址,不用循环!
你的错误在于对同步方式工作流程不了解,在第二次的时候由于还没有连接成功,你
就已经发信息了。看看自己的代码吧!
 
to jinzuo007:
我是用的异步方式呀?这对这方面的确不是很清楚,我把程序发给你,你可以帮我看盾吗?
 
for i:=0 to machinecount-1 do
begin
sleep(3000);
connectMachine(yourmachine);
end;
 
TO:zcm1975117
请你把程序压缩发到 jinzuo007@21cn.com 。另外加一点注释,尤其是你出错的单元。
 
to jinzuo007:发给你了,请帮我看一下。
to weekboy:还是不行,我也用过相应的方法,比如等待一段时间,都不行。
 
TO::zcm1975117
给你回信了,请接收。
 
把你要发的东西放在一个包里。
每次连上的时候就发包里的东西。
 
if ClientSocket.Active then
clientsocket.socket.close;
while ClientSocket.Active do
Application.ProcessMessages;
.
.
.
.
Active := True;
while not Active do
Application.ProcessMessages;
 
to pipi:你留下你的email,我也把程序发给你,你帮我看一下,好吗??
 
to inzuo007:我按照你说的方法,使用UDP协议,在server端加了一个TNMUDP控件后,
运行服务器后,就不能注销机器或者关机了。因为我的服务端是以服务的方法运行的,
你看到源程序就知道了,是什么原因,是不是要做特别的处理呀??
 
TO :zcm1975117
你说的“服务端是以服务的方法运行的”我不太明白。是这样的,你给我发的程序无法编译
通过,因为缺少 ".dcu"文件。我也没细看你的代码,因为需要时间。
但你所说的不能注销机器或者关机应该不属于TNMUDP控件的问题,而是你代码的问题。
 
我说的以服务方式运行,是指不出现在任务栏中,也就是用户不能关闭这个程序!
 
TO:zcm1975117
哦,是这样!(水平高啊) 如果是用户不能关闭程序,那就是程序一但运行,用户
也就无法关机了。因为关机程序还能运行吗?不过这样做好象不太友好对用户来说。
 
如果只是发送相同的消息给各台机器的话,为何不直接用nmudp组件进行广播,或者采用
winsocket2.2的组播技术呢?
 
后退
顶部