2010-07-09 6 views
0

Je veux écrire du code en C# similaire au code suivant en perl. Ce que le code fait est d'envoyer un message via le socket UDP et les demandes d'un port TCP. Le code en Perl est comme ci-dessous:Écrire l'équivalent C# du code perl pour envoyer et recevoir via le socket UDP?

# Get a UDP connection to port 

$proto = getprotobyname('udp'); 
    no strict 'refs'; 
    $udpS = "UDP Socket"; 
if (!socket($udpS, AF_INET, SOCK_DGRAM, $proto)) { 
     $errMsg = "Can't create UDP socket (to $hostname) [$!]"; 
     return (0, $errMsg); 
} 

# Bind this socket to an address. 
my $this = pack("S n a4 x8", AF_INET, 0, "\0\0\0\0"); # ' 

if (! bind($udpS, $this)) { 
     $errMsg = "Can't bind UDP socket (to $hostname) [$!]"; 
     return (0, $errMsg); 
} 

# Request TCP port 

# remote host 
    my $len = 0; # to suppress warnings 
    $iaddr = gethostbyname($hostname); 

if (!defined($iaddr)) { 
    $errMsg = "gethostbyname failed on $hostname"; 
    shutdown($udpS,2); 
    close($udpS); 
     return (0, $errMsg); 
} 

    $sin = sockaddr_in($port, $iaddr); 
# attempt 5 times to get the TCP port before failing 
foreach (0..4) { 
    if (!send($udpS, 1, 0, $sin)) { 
     $errCodeMsg = 
      "Can't send on UDP socket (to $hostname), [$!]"; 
     shutdown($udpS,2); 
     close($udpS); 
      return (0, $errCodeMsg); 
     } 

    my $msg = ""; 
     if(recv($udpS, $msg, 2, 0)) { 
        ($tcpPort) = unpack('n',$msg); 
      # ($tcpPort) = unpack('S',$msg); 
      last; 
     } else { 
      sleep(1); # wait a second! 
     } 
} 

J'écrit le code suivant en C#:

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(host),port); 
Socket soUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);    

      for (int i = 0; i < 5; i++) 
      { 

       int temp = 1;     
       byte[] data = BitConverter.GetBytes(temp); 

       soUdp.SendTo(data, data.Length, SocketFlags.None, endPoint); 

       IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
       EndPoint Remote = (EndPoint)sender; 

       data = new byte[1024]; 
       int recvLength = soUdp.ReceiveFrom(data, ref Remote); 
       data = ReverseBytes(data); //takes care of Endian ness. 

       Console.WriteLine("Message received from {0}", Remote.ToString()); 
       Console.WriteLine("Port is:" + BitConverter.ToInt32(data, 0)); 

      } 

En perl i obtenir le numéro de port d'écriture. Mais en C# je reçois toujours le port en tant que 0. Quelqu'un peut-il comprendre ce que je fais mal?

+0

votre port devrait être 'errd_port' –

+0

Je me suis assuré le nom d'hôte et le port auquel j'envoie le message à droite est – Sam

+0

' BitConverter.ToInt32 (données, 0) '' isnt "Port" ' –

Répondre