1

私は実際に、UDP を介して C アプリケーションから Java アプリケーションに構造体を送信したいと考えています。

そのような構造体:

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

また、type1、2、3、4 も構造体であり、それ自体が他の構造体も含みます。

今のところ、そのような構造を送信するだけです(リストは私の構造です):

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 に答える