Network programming 如何在Vala中接收UDP数据?

Network programming 如何在Vala中接收UDP数据?,network-programming,vala,Network Programming,Vala,发生了另一个Vala问题:我尝试通过UDP发送和接收数据。发送工作正常,通过Wireshark,我可以看到服务器发送了预期的结果。问题是:我的程序无法获取数据 我检查后发现,当创建了一个套接字来发送UDP数据时,特定端口保持打开状态,Wireshark确认了这一点,因为我的电脑没有将任何ICMP消息发送回服务器 到目前为止,我得到的是: try { SocketClient mySocket = new SocketClient(); mySocket.protocol = So

发生了另一个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\u available()
它将返回0


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

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

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

uint8[]buffer=new uint8[1谢谢,它确实打印了……一些东西!好吧,现在,如果你能在你的答案中添加关于如何获取字符串(或字符)的内容在那些“字节”中,那太好了!在Wireshark中,我可以清楚地看到其中的文本。我很确定我收到的文本是UTF8。你能解释一下那是什么吗1@SteffenWinkler:我已更改为在当前区域设置中打印文本(我是从内存中编写的,因此如果无法编译,我很抱歉/我忘记了一些内容)。1