2
這段代碼可以在Linux和Windows XP精細,多播套接字,但是始終未能在64位Windows 7和Windows Server 2008在Windows 7
uses
Classes, Sockets,
{$IFDEF MSWINDOWS}
Windows,
Winsock,
{$ELSE}
BaseUnix,
UnixType,
{$ENDIF}
Sysutils;
type
TIP_mreq = packed record
imr_multiaddr: in_addr; // IP multicast address of group
imr_interface: in_addr; // local IP address of interface
end;
var
ASock_Addr : SockAddr_In;
FSocket : LongInt;
ipmreq : TIP_mreq;
MasterFD,
TempFD : TFDSet;
TestInt : Integer;
Timeout : TTimeVal;
begin
FSocket := fpSocket(AF_INET, LongInt(SOCK_DGRAM), 0);
if (FSocket > 0) then
begin
fpSetSockOpt(FSocket, SOL_SOCKET, SO_REUSEADDR, PChar('True'), Length('True'));
FillByte(ASock_Addr, SizeOf(SockAddr_In), 0);
ASock_Addr.sin_family := AF_INET;
ASock_Addr.sin_port := HtoNS(15510);
ASock_Addr.sin_addr.S_addr := INADDR_ANY;
if (fpbind(FSocket, @ASock_Addr, SizeOf(SockAddr_In)) = 0) then
begin
FillByte(ipmreq, SizeOf(Tip_mreq),0);
ipmreq.imr_multiaddr.s_addr := StrToNetAddr('224.126.126.126').s_addr;
ipmreq.imr_interface.s_addr := StrToNetAddr('10.0.0.3').s_addr;
fpSetsockOpt(FSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, @ipmreq, SizeOf(ipmreq));
{$IFDEF MSWINDOWS}
FD_SET(FSocket, MasterFD);
{$ELSE}
fpFD_SET(FSocket, MasterFD);
{$ENDIF}
fpSetSockOpt在這段代碼總是返回加播成員資格 - 1在Windows 7和Server 2008上
套接字默認在trunk中調用winsock2,參數爲1:1,所以這有點奇怪。也許你使用的是舊版本,它仍然稱爲winsock。它也可以在Vista +多播中需要管理員權限(嘗試右鍵單擊「以管理員身份執行」) – 2013-04-06 17:45:14