envoyer un entier d’un client C à un serveur Java

J’utilise ce code pour envoyer un entier de mon client Java à mon serveur Java

int n = rand.nextInt(50) + 1; DataOutputStream dos = new DataOutputStream(_socket.getOutputStream()); dos.writeInt(n); 

Et je l’ai lu sur le serveur avec ce code

 DataInputStream din = new DataInputStream(socket.getInputStream()); int ClientNumber= din.readInt(); System.out.println(ClientNumber); ClientNumber++; DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeInt(ClientNumber); Ssortingng randomSsortingng= getRandomValue(10,20); dos.writeUTF(randomSsortingng); 

Cela fonctionne parfaitement mais maintenant je veux écrire un client C j’ai essayé ce code

  #include  #include  #include  #include  #include  #include  #define SERVEURNAME "localhost" // adresse IP de mon serveur int to_server_socket = -1; void main ( void ) { char *server_name = SERVEURNAME; struct sockaddr_in serverSockAddr; struct hostent *serverHostEnt; long hostAddr; long status; char buffer[512]; bzero(&serverSockAddr,sizeof(serverSockAddr)); hostAddr = inet_addr(SERVEURNAME); if ( (long)hostAddr != (long)-1) bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr)); else { serverHostEnt = gethostbyname(SERVEURNAME); if (serverHostEnt == NULL) { printf("gethost rate\n"); exit(0); } bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length); } serverSockAddr.sin_port = htons(8071); serverSockAddr.sin_family = AF_INET; /* creation de la socket */ if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0) { printf("creation socket client ratee\n"); exit(0); } /* requete de connexion */ if(connect( to_server_socket, (struct sockaddr *)&serverSockAddr, sizeof(serverSockAddr)) < 0 ) { printf("demande de connection ratee\n"); exit(0); } /* envoie de donne et reception */ int value = htons( 4 ); write( to_server_socket, &value, sizeof( value ) ); printf(buffer); } 

mais ça ne marche pas. J’utilise Eclipse pour comstackr le code Java et exécuter le serveur et xcode pour le code C (le client), mais je ne pense pas que le problème existe.

Edit: j’ai une erreur sur le serveur

java.net.SocketException: tuyau cassé à java.net.SocketOutputStream.socketWrite0 (Méthode native) à java.net.SocketOutputStream.socketWrite (SocketOutputStream.java:92) à java.net.SocketOutputStream.Socket (en cours). sur java.io.DataOutputStream.writeInt (DataOutputStream.java:182) sur ServiceRequest.run (ServiceRequest.java:36) sur java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:439) sur java.util. concurrent.FutureTask $ Sync.innerRun (FutureTask.java:303)

Je pense que c’est parce que le serveur attend un nombre entier, mais ce n’est pas …?

Deux choses qui me sautent aux yeux dans cette déclaration …

 write(to_server_socket,"4",4); 

1) “4” n’est pas un entier, c’est une chaîne terminée par un zéro (bon, d’accord, c’est un entier, mais ce n’est pas ce que vous “vouliez” me faire pense)

2) Vous envoyez la valeur en ordre hôte-octet, qui peut être identique ou non à l’ordre en octets réseau.

 int value = htons( 4 ); write( to_server_socket, &value, sizeof( value ) ); 

Au-delà, l’erreur “pipe cassée” de java socketWrite() tendrait à indiquer que votre côté envoi (l’application C) a fermé le socket et que votre côté java essaie toujours de l’écrire.

Votre code client C ouvre le socket, écrit dessus puis imprime immédiatement un tampon que vous n’avez jamais rempli et quittez le programme. Dès que le programme se ferme, le socket que vous avez créé est fermé, d’où l’erreur “canal cassé” sur votre serveur Java. Vous devez lire une réponse du serveur …

 int value = htonl( 4 ); int reply = 0; if( send( to_server_socket, &value, sizeof( value ), 0 ) != sizeof( value ) ) { printf( "socket write failed: %s", strerror( errno ) ); exit( -1 ); } if( recv( to_server_socket, &reply, sizeof( reply ), MSG_WAITALL ) != sizeof( reply ) ) { printf( "socket read failed: %s", streror( errno ) ); exit( -1 ) } printf( "got reply: %d\n", ntohl( reply ) ); 

Sur une note séparée … vous indiquez que vous recevez 262144 sur le serveur … est-ce avant ou après les modifications que j’ai proposées? 262144 est 0x00040000 – alors … vous en avez eu 4, mais pas où vous vous attendiez à le recevoir. Donc, vous utilisez des ints 32 bits (j’aurais dû réaliser cela), ce qui signifie que vous voulez utiliser htonl() et ntohl() au lieu des htons() et ntohs() qui sont des conversions entières courtes.