另一个Vala问题发生:我尝试通过UDP发送和接收数据。发送作品和通过Wireshark我可以看到,服务器发送预期的结果。问题是:我的程序没有得到数据。如何在Vala中接收UDP数据?
我检查了一下,我发现当创建一个套接字发送UDP数据时,特定的端口保持打开状态,这是由Wireshark确认的,因为我的PC不会将任何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.get_available()
返回0
我可以lsof | grep used_portnumber
检查,果然,所使用的插座保持打开状态。我究竟做错了什么?
谢谢,这确实打印出来......有些东西!那么,现在如果你可以添加你的答案,就如何从这些'字节'中得到一个字符串(或字符),那很好!在Wireshark中,我可以清楚地看到那里的文本。 –
我很确定我收到的文字是UTF8。你也可以解释1 << 16做什么? –
@SteffenWinkler:我已经改变为在当前语言环境中打印文本(我正在从内存中写入,所以我很抱歉,如果它不编译/我已经忘记了一些东西)。 1 << 16是最大的UDP长度(长度是16位,所以我需要2^16。1 << n与2^n相同),并且64K不是太大的内存来担心它。 –