2013-04-04 17 views
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上

回答

4

我想通了。這是與這些操作系統相關的Freepascal問題。通過將fpBind和fpSetSockOpt更改爲Winsock調用(Bind和SetSockOpt),它可以在這些操作系統中正常工作。

+1

套接字默認在trunk中調用winsock2,參數爲1:1,所以這有點奇怪。也許你使用的是舊版本,它仍然稱爲winsock。它也可以在Vista +多播中需要管理員權限(嘗試右鍵單擊「以管理員身份執行」) – 2013-04-06 17:45:14