Envoi int via socket de Java à C – résultats étranges

J’ai un serveur simple écrit en Java, qui envoie simplement un Integer à un client connecté. J’ai un client écrit en C qui se connecte au serveur et imprime l’entier reçu.

Mon problème est que le résultat varie. Environ la moitié des fois que j’exécute le client, j’obtiens le résultat correct (234), mais d’autres fois, je reçois 8323072.

C’est le serveur:

class TCPServer { public static void main(Ssortingng args[]) throws Exception { ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept(); System.out.println("welcomeSocket.accept() called"); DataInputStream inFromClient = new DataInputStream(connectionSocket.getInputStream()); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); outToClient.writeInt(234); } } 

}

Et voici le client:

 int main(int argc, char *argv[]) { if(argc != 4){ printUsage(); return; } char* serverIP = argv[1]; char* serverPortC = argv[2]; char* integerToSendC = argv[3]; int serverPort = atoi(serverPortC); int integerToSend = atoi(integerToSendC); int socketDesc = socket(AF_INET, SOCK_STREAM, 0); if(socketDesc < 0) { printf("Error when creating socket\n"); return; } struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(serverPort); inet_pton(AF_INET, serverIP, &serverAddr.sin_addr); int connection = connect(socketDesc, (struct sockaddr*) &serverAddr, sizeof serverAddr); if(connection < 0) { printf("Error when establishing connection\n"); return; } char intBuffer[4]; if(recv(socketDesc, intBuffer, sizeof intBuffer, 0) == -1){ printf("Error while receiving Integer\n"); } int receivedInt = ntohl(*((int *) &intBuffer)); printf("Received int: %d\n", receivedInt); close(socketDesc); } 

Merci d’avance pour votre aide!

Edit: Donc à la fin, j’ai fait quelque chose comme ça, juste pour tous ceux qui ont le même problème:

 while(receivedBytes < 4){ int readBytes = read(receiverSocket, &intBuffer, (sizeof intBuffer) - receivedBytes, receivedBytes); receivedInteger += (intBuffer << (8*receivedBytes)); receivedBytes += readBytes; } 

Pouvez-vous être sûr d’avoir reçu les octets sizeof intBuffer côté client? Non, vous ne pouvez pas, car recv() peut retourner moins d’octets que ceux demandés.

Mod vous code pour boucler recv() tant que moins d’octets demandés ont été reçus et aucune erreur ne s’est produite.

Notez que recv() ing 0 octets indique que la connexion a été fermée par l’autre côté.

Assurez-vous également que le côté serveur envoie dans l’ordre des octets du réseau.

Aussi ^ 2: C’est une bonne idée d’initialiser les variables ( intBuffer ici), au moins pendant la phase de développement, dira: avant la phase de réglage.

Votre problème pourrait être dû aux sous-limites des différents types de données.

En Java, 4 octets sont atsortingbués à int et 2 octets pour un shortshort .
En C, 4 octets sont long et 2 octets pour int .

Cela signifie que Java int -> C long et Java short -> C int .
Maintenant, cela dépend de vos priorités.

Si vous voulez effectuer un calcul mathématique intense en Java et envoyer le résultat via socket à C, je vous recommande de faire Java int -> C long ou
Si vous souhaitez simplement envoyer de petits nombres et que le calcul intense soit effectué en C, effectuez la conversion Java short -> C int .

J’espère que ça a aidé.