菜鸟问题 怎样同时给局域网上的多台机器发送信息 (30分)

  • 主题发起人 主题发起人 cgdlin
  • 开始时间 开始时间
C

cgdlin

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi 中有一个 两台机器互相发送消息的 例子
可是要同时给局域网上的多台机器(特定的)发送信息该怎样实现。

请大虾 指点
 
不知道用广播地址行不行,没试过也不敢试
 
用winsock广播消息~procedure TForm2.FormCreate(Sender: TObject);
use winsock
const
WM_SOCK = WM_USER + 1; //自定义windows消息
UDPPORT = 6543; //设定UDP端口号
//INADDR_ALLHOSTS_GROUP = u_long($e0000001); //D类地址224.0.0.1
procedure Tfrmmain.FormCreate(Sender: TObject);
var
TempWSAData: TWSAData;
optval: integer;
begin
memo1.Clear;
memo2.Clear;
// 初始化SOCKET
if WSAStartup($101, TempWSAData)=1 then
showmessage('StartUp 错误!');

s := Socket(AF_INET, SOCK_DGRAM, 0);
if (s = INVALID_SOCKET) then //Socket创建失败
begin
showmessage(inttostr(WSAGetLastError())+' Socket创建失败');
CloseSocket(s);
//exit;
end;
//发送方SockAddr绑定
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := INADDR_ANY;
addr.sin_port := htons(UDPPORT);
if Bind(s, addr, sizeof(addr)) <> 0 then
begin
showmessage('绑定失败!');
end;

optval:= 1;
if setsockopt(s,SOL_SOCKET,SO_BROADCAST,pchar(@optval),sizeof(optval)) = SOCKET_ERROR then
begin
showmessage('无法进行UDP广播');
end;

{mreq.imr_multiaddr.S_addr := INADDR_ALLHOSTS_GROUP;
mreq.imr_interface.S_addr := INADDR_ANY;
if setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,pchar(@mreq),sizeof(mreq)) = SOCKET_ERROR then
begin
showmessage('无法进行UDP组播');
end;}


WSAAsyncSelect(s, frmmain.Handle , WM_SOCK, FD_READ);
//接收端SockAddrIn设定
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(UDPPORT);

label3.Caption := '端口:'+inttostr(UDPPORT);
setwindowlong(application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;procedure Tfrmmain.ReadData(var Message: TMessage);
var
buffer: Array [1..4096] of char;
len: integer;
flen: integer;
Event: word;
value: string;

begin

flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Port := htons(UDPPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
value := copy(buffer, 1, len);
Memo1.Lines.add(value)
end;
end;

procedure Tfrmmain.SendData(Content: String);
var
value{,hostname}: string;
len: integer;

begin

FSockAddrIn.SIn_Addr.S_addr := INADDR_BROADCAST;
//FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(Edit1.text)); //INADDR_BROADCAST; //INADDR_BROADCAST = -1 ?
value := Content;
len := sendto(s, value[1], Length(value), 0, FSockAddrIn, sizeof(FSockAddrIn));
if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
showmessage(inttostr(WSAGetLastError()));
if len = SOCKET_ERROR then
showmessage('发送失败');
if len <> Length(value) then
showmessage('没有发送完全');
end;

 
用UDP广播,向地址为192.168.0.255的IP发送
^^^
则所有地址为:192.168.0.X的机器都会收到。
我已经这样用过了。
 
可以试试用MAILSLOT
可以检索一下以前的一些帖子,有人贴过钱达智所写的一篇关于MAILSLOT的文章
如果找不到,下次我帮你贴出来
 
同意LeonSu的。
 
如果是在网络中,并且不知道ip,该怎么办呢,
广播的速度上会怎么样呢?
 
net send erverone 消息
 
caochen
谢谢你的答复。我还是不明白,能详细点吗?
 
例如:给地址为:192.168.0。1 发送信息用net send 格式为:
net send 192.168.0.1 "你要发的信息加在此"
若要同时发给多台机器,添加多个地址即可,
此方法只在98以上的版本才能用
 
鸡蛋:
这条命令在那儿执行?是用 clientsocket 吗?
 
在Dos命令行执行,或在运行框里面。
 
那 我的程序怎么能收到 发送的数据呢?
 
我的程序需要接受发送来的数据
 
强烈要求用广播,
先得到本机的IP,方法有许多,这里我就不多说了。
如本机的IP是:192。168。0。1,则向192。168。0。255广播,用UDP控件来做。
广播的速度用一下QQ就知道了。
 
谢谢大家

不好意思 分数不多
 
后退
顶部