【问题标题】:How to receive UDP data in Vala?如何在 Vala 中接收 UDP 数据?
【发布时间】:2012-12-24 22:53:02
【问题描述】:

发生另一个 Vala 问题:我尝试通过 UDP 发送和接收数据。发送有效,通过 Wireshark 我可以看到服务器发送了预期的结果。问题是:我的程序没有得到数据。

我检查了一下,我可以看到,当创建一个套接字来发送 UDP 数据时,特定端口保持打开状态,Wireshark 确认了这一点,因为我的电脑没有将任何这些 ICMP 消息发送回服务器.

到目前为止我得到了什么:

try
{
    SocketClient mySocket = new SocketClient();
    mySocket.protocol = SocketProtocol.UDP;
    mySocket.type = SocketType.DATAGRAM;
    var conn = mySocket.connect (new InetSocketAddress(addr,targetPort));
    conn.output_stream.write(themessage_in_a_uint8_array);
    DataInputStream response = new DataInputStream (conn.input_stream);
    string resp ="";
    char myChar;
    try
    {
        do
        {
            myChar = (char)response.read_byte();
            print ("Response" + myChar.to_string());
        }while(true);
    }
    catch(Error e)
    {
        print(e.message);
    }
}
catch(Error e)
{print(e.message);}

当前发生的情况:消息已发送,字符串 'Response' 打印一次到控制台,然后循环。

如果我检查response.get_available(),它会返回 0。

我可以通过lsof | grep used_portnumber 进行检查,果然,使用的套接字保持打开状态。我做错了什么?

【问题讨论】:

    标签: network-programming vala


    【解决方案1】:

    我不确定,但这是我怀疑的:

    UDP 是一种数据报协议(数据被明确地分割成数据)。服务器向客户端发送了一个数据报。现在在 BSD 套接字(以及在它之后的任何地方)中,如果底层套接字具有数据报类型,则 read 读取完整的数据包。如果缓冲区长度不足,则消息被截断

    解决方案以一个字节读取。例如

    uint8[] buffer = new uint8[1 << 16]; // Maximum UDP length - we don't loose anything
    unowned string locale;
    bool need_convert = GLib.get_charset (out locale);
    do {
        ssize_t len = response.read (buffer);
        string text;
        if (need_convert) {
            text = GLib.convert ((string)buffer, len, locale, "UTF-8");
        } else {
            text = (string)buffer;
        }
        stdout.print("Response " + text);
    } while (true);
    

    编辑我已更改代码以打印 UTF-8 文本 - 不假设当前语言环境是基于“UTF-8”的。

    PS 1 这是我的猜测,因为它是我想到的 BSD 套接字(还有 Winsockets 和基于此的所有东西)的一个陷阱。如果问题更具体(即不是问题的答案),请保持优雅。

    PS 2 一般来说,我建议不要混合字节和字符。虽然在 ASCII 兼容的编码(ISO、UTF-8)中发送字符的 ASCII 子集是安全的,但它在尝试 CJK 编码或发送者将通过 UTF-8 发送“ą”并且发送者将将其视为 ISO-8859-2(此字符具有不同的编码)。我认为它仅适用于玩具示例。如果没有,您可能想阅读What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

    【讨论】:

    • 谢谢,确实打印出来了……东西!好吧,现在如果您可以添加有关如何从这些“字节”中获取字符串(或字符)的答案,那就太好了!在 Wireshark 中,我可以清楚地看到其中的文字。
    • 我很确定我收到的文本是 UTF8。你能解释一下 1
    • @SteffenWinkler:我已更改为在当前语言环境中打印文本(我是从内存中写的,所以如果它没有编译,我很抱歉/我忘记了一些东西)。 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多