我對Java和C編程相當新穎,需要一些幫助。 所以我有一個C應用程序發出的結構通過UDP:C通過UDP將結構轉換成Java對象
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char**argv)
{
int sockfd,n;
struct sockaddr_in servaddr,cliaddr;
struct dataType {
char name[4];
unsigned short did;
unsigned short sid;
unsigned short type:4,pri:2,cb:2,flags:8;
unsigned char pblock;
unsigned char tblock;
unsigned short mess;
unsigned int window:24;
};
struct dataType sample_header;
strcpy(sample_header.name,"TEST");
sample_header.did=23;
sample_header.sid_id=1;
sample_header.type=1;
sample_header.pri=01;
sample_header.cb=1;
sample_header.flags=18;
sample_header.pblock=10;
sample_header.tblock=20;
sample_header.mess3;
sample_header.window=123890;
sockfd=socket(AF_INET,SOCK_DGRAM,0);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
servaddr.sin_port=htons(6120);
sendto(sockfd, (char *)&sample_header, (sizeof(struct dataType)),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
}
現在我需要能夠通過UDP接收這個數據在Java和填充的對象與這些值。我可以得到第一個字符串(名稱),但不知道如何去獲取剩餘的項目。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.nio.*;
public class UDPReceive {
public static void main(String args[]) {
try {
int port = 6120;
DatagramSocket dsocket = new DatagramSocket(port);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
dsocket.receive(packet);
byte[] data = packet.getData();
String msg1 = new String(data, 0, 5);
System.out.println("Here is SOME :" + msg1);
packet.setLength(buffer.length);
}
} catch (Exception e) {
System.err.println(e);
}
}
}
我看過Google的協議緩衝區,但它顯然需要雙方都進行更改。 我還需要能夠最終將這些數據從Java對象發送到UDP並返回到C結構。
很多謝謝。
這聽起來像是一個明智的長期解決方案。推薦使用跨語言的方法是什麼?我應該走下Google的協議緩衝區路線嗎?結構相當簡單,不必改變。這在運行時也需要很快。請將您指向正確的方向,謝謝。 – Andrey
@Andrey:對於一個尺寸適中的結構,我只需手動完成。 '寫(FD,b.name,的sizeof(b.name)); tmpushort = htons(b.did);寫(FD,tmpushort,的sizeof(tmpushort)); tmpuchar = b.type;寫(FD,tmpuchar,的sizeof(tmpuchar)); tmpuint = htonl(b.window);寫(fd,tmpuint,sizeof(tmpuint));'等等獎勵點,如果你使用'u_int8_t'和'u_int16_t'和'u_int32_t'來減輕你對各種平臺上char/short/int/long大小的依賴。另一方面閱讀它,將網絡訂單轉換回主機訂單,然後將其存儲,但無論您需要如何。 –