///接收数据 procedure ReadData(var Message: TMessage); message WM_SOCK; var buffer: Array [1..4096] of char; len: integer; flen: integer; Event: word; value: string; begin flen:=sizeof(FSockAddrIn); 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(MY_GROUP)); 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('send fail'); if len <> Length(value) then showmessage('Not Send all'); end;
组播有专门的 ip 地址段,发出的数据由底层的网络协议栈或者路由器去完成转发。windows 有一组api就是用于组播网络的,我只有vc的源码。
procedure ReadData(var Message: TMessage); message WM_SOCK;
var
buffer: Array [1..4096] of char;
len: integer;
flen: integer;
Event: word;
value: string;
begin
flen:=sizeof(FSockAddrIn);
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(MY_GROUP));
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('send fail');
if len <> Length(value) then
showmessage('Not Send all');
end;
使用idudpclient的Broadcast发送