0

我创建了一个发送 get server list 命令的客户端,但接收到的字节不可读。

这是我的代码:

    byte[] receiveBytes = udp.Receive(ref RemoteIpEndPoint);

    string[] returnData = Encoding.Default.GetString(udp.Receive(ref RemoteIpEndPoint)).Split('\\');
    textBox1.Lines = returnData;

在当地人中,我看到了写入值在此处输入图像描述

但是程序告诉我这个

在此处输入图像描述

有人可以告诉我我的代码有什么问题吗?

好的,我将代码更改为

 yte[] receiveBytes = udp.Receive(ref RemoteIpEndPoint);
    int size = receiveBytes.Length;
    int i = 0;
    while ( i <= size-5 )
    {

        string ip = receiveBytes[i] + "." + receiveBytes[i + 1] + "." + receiveBytes[i + 2] + "." + receiveBytes[i + 3] ;
        int port = receiveBytes[i + 4] * 256 + receiveBytes[i + 5];

        textBox1.Text += ip + ":" + port.ToString() + Environment.NewLine;
        i = i + 6;
    }

但收到的数据不对!

我在 php 上找到了微笑代码及其工作。

$data = explode("\\", $data);

for($i=0, $o=0; $i<count($data); $i++) {
    if (strlen($data[$i])>=4) { //fix

        // First 4 bytes are the ip:
        $list_server[$o]['ip']=ord($data[$i][0]).".".ord($data[$i][1]).".".ord($data[$i][2]).".".ord($data[$i][3]);

        // Last 2 bytes are the port, Takes penultimate number and multiply by 256 and sum with the last number:
        $list_server[$o]['port']=(ord($data[$i][4])*256) + ord($data[$i][5]);
        //GetName($list_server[$o]['ip'],$list_server[$o]['port']);
        $o++;
    }
}

我猜不出我的代码有什么问题。

4

1 回答 1

0

您假设整个 UDP 数据包是英文可读消息。几乎从来没有这种情况。

您需要研究您要连接的服务器使用的协议。例如,它可能会向您发送一个标识符列表,希望您返回该列表以查找该特定服务器的更多详细信息。

编辑:

您最新的 PHP 版本使用 a\来分隔地址,因此它们的发送方式如下:

127.0.0.1:8080\192.168.0.1:9000\8.8.8.8:80

这将被编码为(为清楚起见添加了空格):

7F000001 1F90 5C c0A80001 2328 5C 08080808 0050

我在您的示例中没有看到对\字符的任何引用,因此您可能会将这个示例解码为(请注意,您通常无法使用它,但您修改了保护子句以隐藏此错误):

127.0.0.1:8080
92.192.168.0:291
40.92.8.8:2056
于 2013-03-18T18:21:43.647 回答