2010-07-09 101 views
0

我想用C#编写代码,类似于perl中的以下代码。代码所做的是通过UDP套接字发送消息并请求TCP端口。在Perl代码如下:编写C#相当于perl代码通过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! 
     } 
} 

我在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)); 

      } 

在Perl中,我得到了写端口号。但在C#中,我总是将端口设为0.任何人都可以弄清楚我做错了什么?

+0

你的端口应该是'errd_port' – 2010-07-09 21:32:03

+0

我已经确定的主机名和端口,对此我将消息发送到是正确 – Sam 2010-07-09 21:34:01

+0

'BitConverter.ToInt32(数据,0)''未启用“端口”' – 2010-07-09 21:40:05

回答