1

我实际上想通过 UDP 将结构从 C 应用程序发送到 java 应用程序。

结构看起来像这样:

typedef struct {
type1 liste1;
type2 liste2;
type3 liste3;
type4 liste4;
}liste;

type1,2,3,4 也是包含其他结构的结构。

现在,我只是发送这样的结构(liste 是我的结构):

sendto(socketOut, &(liste), sizeof(liste), 0, (SOCKADDR *) &(recvAddrAck),sizeof(recvAddrAck));

我在java应用程序上得到了这样的UDP:

DatagramSocket socket = new DatagramSocket(SERVERPORT);
byte[] buf = new byte[1500];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
while (true) {
socket.receive(packet);
data = packet.getData();
}

所以,我的问题是,如何解码数据?我是 UDP 协议的新手,但是我和我的朋友 Google 做了一些研究,我发现了一些东西,比如 C 端的 htons/htonl/... 和 java 的 ByteArrayInputStream/DataInputStream ...边。但我真的不明白如何以及何时必须使用这些东西,尤其是对于 java 端。

希望我的问题可以理解

谢谢

4

2 回答 2

1

您将需要以某种方式进行序列化。手动,通过某种文本格式或 XML,或者如果您想要更健壮的东西,请查看双方的 ASN.1 / BER 库。

于 2012-04-12T15:00:14.667 回答
0

不确定是否理解,但您是否看过 DatagramPacket ?

就像是

DatagramPacket answerPacket = null;
  try { 
    byte[] buffer = new byte[REC_BUFFER_SIZE];
    answerPacket = new DatagramPacket(buffer, REC_BUFFER_SIZE);
    yourSocket.receive(answerPacket);
    log.debug("Received UDP Packet from " + answerPacket.getAddress().getHostAddress());
  } catch (SocketTimeoutException e) {
    log.debug("No Answer - Connection to DatagramSocket timed out");
  }

if (answerPacket != null && answerPacket.getLength() != 0) {
    String result = new String(answerPacket.getData());
    result = result.trim(); // remove leading and trailing whitespaces...
}

可能会做你需要的,但这意味着使用自定义格式。

于 2012-04-12T14:57:25.413 回答