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.任何人都可以弄清楚我做错了什么?
你的端口应该是'errd_port' – 2010-07-09 21:32:03
我已经确定的主机名和端口,对此我将消息发送到是正确 – Sam 2010-07-09 21:34:01
'BitConverter.ToInt32(数据,0)''未启用“端口”' – 2010-07-09 21:40:05