2012-04-12 72 views
1

我實際上想通過UDP將結構從C應用程序發送到Java應用程序。如何使用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)); 

而且我得到的UDP一樣,在Java應用程序:

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方面。

地希望我的問題是可以理解的

感謝

+1

我認爲在您將結構發送給java之前,您可以將其轉換爲像** liste1; liste2; liste3; liste4 **這樣的文本格式。然後你的Java應用程序將得到一個原始文本值,然後拆分你的結構的值,並使其成爲一個Java類。 – Fer 2012-04-12 14:46:48

回答

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... 
} 

可能做你需要的東西,但它意味着自定義格式的使用。

+0

這就是我使用的,如果我發送例如'char * tmp =「hello」,它會起作用;'我將在java端收到你好,但是結構複雜,我不知道如何繼續。 – Bibu 2012-04-12 15:36:34

+0

找出一種方法來編碼你的結構,例如,使用XML或分隔的字段列表。 – theglauber 2012-04-12 16:11:07

+1

我不會選擇xml,但更簡單些,|分離的值或JSON類似的語法,C端的東西不是太複雜 – 2012-04-12 16:18:21

1

您需要以某種方式序列化。無論是手動,通過一些文本格式或XML,或者如果您想要更強大的功能,請查看兩側的ASN.1/BER庫。

+0

我已經看着ASN。1/BER庫,但我不知道它是否僅僅是第一次接觸,但它看起來很難使用 – Bibu 2012-04-12 15:44:19

+0

我同意,這很複雜,但以廣義的方式進行是件很難的事情。創建一個特定於你的結構的導出/導入格式會更容易,XML是一個很好的格式,因爲它是自我記錄和易於理解的。 – theglauber 2012-04-12 16:10:29

+1

我不同意ASN.1很難使用。看看http://www.oss.com/asn1/resources/asn1-made-simple/introduction.html(ASN.1 Made Simple)。正確的ASN.1工具可以使您的任務變得輕鬆。 – 2012-04-13 00:01:54

相關問題