WinSock问题:根据Port 搜索主机 (100分)

  • 主题发起人 主题发起人 h2b
  • 开始时间 开始时间
H

h2b

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在WinSock编程中不想固定Server端的地址(因为:网络中的服务器有多个),要想让Client
端自动的扫描网络得到可以使用的Server地址的集合(例如:放在ComboBox里),使用以下程序段
出现10049错误,那位高手有正确的方法救小弟一命。
////小弟的错误程序
var i:integer;
Check:boolean;
begin
i:=0;
while i< 255 do
begin
i:=i+1;
try
ClientSocket1.Close;
ClientSocket1.Port:=1888;
ClientSocket1.Host:='192.168.0.'+inttostr(i);
ClientSocket1.Open;
Check:=True;
except
Check:=False;
end;
if Check then
ComboBox1.Items.Add('192.168.0.'+inttostr(i));
end;
end;
 
10049 Address is not available from the local machine.

把ClientType设置为ctBlocking即可。
 
honestman老兄:
不行呀,我按你的方法更改了ClientSocket的ClientType属性,还是不行耶,明明网络上有该端口的
主机就是找不到,是否有其他的方法呀?
 
没有出现那个错误了吧?
 
为何使用ODBC添加SQL server数据源,点击服务器选项的时候,局域网有SQL Server服务器的机器
的名字马上就显示出来了呢?不会无法用Winsocket查到具有特别端口的主机呀?
 
是的错误倒是没有了,但主机还是没能找到
 
加一個SimpleObjectBroker控件,在servers中寫入你的主機名就好了!
 
bright78老兄:
在SimpleObjectBroker加入主机地址或名程当然可以找到主机,但问题是,——可能我没有说的很明白
的错——现在事先我并不知道主机的地址呀(是设计动态主机而设计的哦),所以,问题还是没得到解决呀。
 
1.在局域网中采用UDP广播的确是可行的。这需要你的服务器运行时能够响应客户端的UDP广播。
2.如果不知道是局域网还是Internet,通用的方法是类似于dns的做法,设计一台固定ip或域名的机器作为跟踪服务器,当服务器运行起来后向跟踪服务器注册,客户端也启动时也向跟踪服务器注册,由跟踪服务器向客户端返回服务器地址表。这个跟踪服务器很好设计,甚至一个ASP或者JavaScript网页都可以完成。
3.Singleton服务器。每台服务器中加入Singleton服务,当整个网络中有一个Singleton服务器时,该服务向Singleton服务器注册,并返回这台服务器的地址;如果系统中没有Singlwton服务器则该服务器就是Singleton服务器,返回所有注册服务器的列表。每台服务器都可以做为Singleton服务器,维护比较方便。该服务器可以用rpc方式实现。
4.查询ip地址的方法不好做得通用。你无法事先知道你的地址是192.168.0.xxx。而且直接连接然后又断开这种扫描方式并不可取。等于无端增加服务器负荷。
 
1.对于不知道主机地址又要访问的需求一般通过在局域网内使用UDP协议向广播地址(255.255.255.255)和端口发送查询请求,然后服务端向客户端返回响应,这样客户端就知道了服务器的地址.
2.你在上面的代码中将<255改为 <254看看,我的印象中,X.X.X.0表示X.X.X整个网段,
而X.X.X.255表示X.X.X网端的广播地址,应该不能将X.X.X.255设为主机的IP地址吧.
 
http://zw84611.51.net/LanExplorer1.41.rar
 
问题已经解决,不好意思,今天才来分分

错误,出现在,应该首先 PING通对方,然后连接,错误就自动少了,既可以用列举 网络邻居,也可以 通过循环来PING
PING 的方法如下:
function testip(IP:string):Boolean;
var
WSAData:TWSADATA;
Addr:DWORD;
begin
WSAStartup(2, WSAData);
Addr:=inet_addr(PChar(IP));
Result:=gethostbyaddr(@Addr,sizeof(Addr),PF_INET)<>nil;
WSACleanup();
end;
列举网络邻居://///这个程序刚抄,没改
var
f:tstringlist;
ll,ii:integer;
s1,s:string;
b:bool;
begin
f:=tstringlist.Create;
try
f.LoadFromFile('c: ~~.txt');
except
end;
if f.Count>10 then
begin
memo1.Clear;
memo1.lines.add(f.text);
timer1.Enabled:=false;
f.Free;
//去掉多余的行和'/'
for ll:=memo1.lines.count-1 downto 0 do
begin
if strpos(pchar(memo1.lines.strings[ll]),'/')=nil then
memo1.lines.delete(ll)
else
memo1.lines.Strings[ll]:=delspace(memo1.lines.Strings[ll]);
end;
end;
最后是一个通过机器名得到IP地址的函数
function nametoip(name:string):string;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
begin
result:='';
WSAStartup(2, WSAData);
HostEnt := gethostbyname(PChar(name));
if HostEnt <> nil then
begin
with HostEnt^ do
result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);
end;
WSACleanup;
end;
 
后退
顶部