structures in Java an structures in C angleichen

raphk

Mitglied
Hallo ich habe folgendes Problem:

Ich habe einen C Server programmiert der via Sockets mit seinen Clients kommuniziert. Um die Daten vom einem zum anderen zu schicken benutze ich in C structures. Damit haben die C Clients logischerweise keine Probleme.
Nun will ich auch noch nen Java Client machen aber da stellt sich dann das Problem wie kann ich da ne structure so deklarieren das mein C Server diese auch erkennt.

Wenn ich zB ne struct von 4 INT in C hab wartet der Server auf 16 byte bevor er weitergeht. Wenn ich in Java nen Vector von 4 INT mach klappt das nicht.

Code:
server_receive_socket(&hSocketService[num], LONG_PROTOCOL_HEADER, (char*)prot_header);

Das ist die Receive Linie aufm Server. Erster Parameter is das Socket, zweiter die erwartete Länge und der letzte ist die struct in C in der die Daten gespeichert werden.
Mit einem C Client funktionniert das auch tadellos. Nur halt der Java Client macht mir Ärger. Er verbindet sich zwar mim Server aber dieser erhält bei der recieve nicht die gewünschte Menge an Daten.

Ich hoffe mal das mir einer weiter helfen kann!
 
Hallo!

Vorweg, unter Java gibt es kein struct Konstrukt im eigentlichen Sinne... (eine Klasse mit nur oeffentlichen Membern ist IMHO kein struct...)

Wenn ich zB ne struct von 4 INT in C hab wartet der Server auf 16 byte bevor er weitergeht. Wenn ich in Java nen Vector von 4 INT mach klappt das nicht.
Ein int unter C ist u.U. != ein int unter Java. Manchmal gibt es dort je nach C (Ansi/ISO...) Version und verwendete Platform Unterschiede (ByteEncoding: BigEndian vs. LittleEndian)
Ein int unter Java ist 4 bytes gross. Damit du die ints von C auch in Java verwenden kannst solltest du drauf achten, dass sie die gleiche ByteOrder enthalten.
Schau doch mal ob du das nicht mit der Klasse java.nio.ByteBuffer hinbekommst:
Code:
  /**
   * 
   */
  package de.tutorials;
  
  import java.nio.ByteBuffer;
  import java.nio.ByteOrder;
  
  /**
   * @author Tom
   * 
   */
  public class ByteBufferExample {
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) {
  		// 4 ints mit je 4 bytes.
  		ByteBuffer buffer = ByteBuffer.allocateDirect(4 * 4);
  		buffer.order(ByteOrder.LITTLE_ENDIAN);
  		buffer.putInt(Integer.MAX_VALUE)	   //2147483647
  			  .putInt(Integer.MAX_VALUE - 1)   //2147483646
  			  .putInt(Integer.MAX_VALUE - 2)   //2147483645
  			  .putInt(Integer.MAX_VALUE - 3);  //2147483644
  
  		buffer.flip();
  		while (buffer.hasRemaining()) {
  			System.out.println(buffer.getInt());
  		}
  
  	}
  }

Gruss Tom
 
Zurück