Client Socket Java Server Socket C

Estou implementando um cliente socket Java para fazer uma conexao local com um servidor socket em C. O cliente java envia o tamanho de uma String depois uma String ao servidor. O servidor le o tamanho da string, aloca memoria para ela, e depois le a string.
Criei os clientes/servidores em Java e em C, mas nao estou conseguindo o resultado esperado. De java pra java funciona e de c pra c funciona, mas de java pra c ou de c pra java nao da o resultado esperado.
Nao estou conseguindo enxergar o problema.
Obrigado.
Gustavo.

Estou enviando o codigo do servidor C e do cliente java.

Servidor C

// gcc -o TcpServer TcpServer.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <unistd.h>

int main() {

  char *str_buff;
  int len_buff;

  int server_socket_fd;
  int client_socket_fd;
  
  struct sockaddr_in addr_server;
  struct sockaddr_in addr_client;
  
  socklen_t len_addr_client;
  
  int quit_message = 0;

  server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
  
  addr_server.sin_family = AF_INET;
  addr_server.sin_port = htons(12345);
  addr_server.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

  bind(server_socket_fd, (struct sockaddr *) &addr_server, sizeof(addr_server));
  
  listen(server_socket_fd, 5);
  
  while (!quit_message) {

    client_socket_fd = accept(server_socket_fd, (struct sockaddr *) &addr_client, &len_addr_client);

    read(client_socket_fd, &len_buff, sizeof(len_buff));

    printf ("SIZE[%d]
 ", len_buff);

    str_buff = (char *) malloc(len_buff);

    read(client_socket_fd, str_buff, len_buff);
    
    printf ("STRING[%s]
 ", str_buff);
    
    if (strcmp(str_buff, "quit") == 0) {
      quit_message = 1;
    }

    free(str_buff);
    
    close(client_socket_fd);
  }
  
  close (server_socket_fd);
  
  return 0;
}
Cliente Java

package socket.cliente;

import java.net.*;
import java.io.*;

public class TcpClient {
    
    public static void main(String[] args) {
        try {
            Socket sock = new Socket(InetAddress.getLocalHost(), 12345);
            BufferedOutputStream out = new           BufferedOutputStream(sock.getOutputStream());
            String env = args[0];
            int len = env.length();
            System.out.println("SIZE[" + len + "]");
            out.write(len);
            out.write(env.getBytes(), 0, len);        
            System.out.println("STRING[" + env + "]");
            out.close();            
            sock.close();
        } catch (UnknownHostException e1) {
            e1.printStackTrace(System.err);
        } catch (IOException e2) {
            e2.printStackTrace(System.err);
        }
    }
    
}

Editado por um moderador que gosta de ver códigos entre as tags code

Endianess e encoding das strings. Comece arrumando isso.

Como faço isso ???

Verificando qual o endianess da plataforma onde teu código em C está sendo compilado, apos isso ajuste, se necessario a versão java (ela é big endian).

Encoding é mais facil:

String s = "hello";
byte[] bytes = s.getBytes("US-ASCII");

Supondo que voce esteja usando esse encoding no C, que me parece ser o caso.

Obrigado pelas dicas.
O encoding da String estava OK, mas nao era realmente o problema.
O problema é na passagem do tipo int. Nao sei como resolver isso. Tem ideia de como resolvo esse problema ???
Vou mudar a implementacao do meu servidor para alocar um buffer de tamanho fixo. O cliente java enviara apenas a String.
[]s,
Gustavo.

Olá

Envie e receba arrays de bytes.

[]s
Luca