Bonjour,
J'essaie de faire communiquer un programme C++ avec un programme java (sur la même machine), et je regarde un peux comment réagissent les socket. J'utilise boost côté C++ et les classes ServerSocket et Socket du côté Java. Avec une seule Socket pour la lecture et l'écriture, le programme fonctionne bien mais ne gère pas bien certain cas d'envoi simultanés.
J'ai donc essayé d'ouvrir deux Socket sens unique pour que chaque programme soit le seul à lire ou écrire sur une Socket. mais j'ai une erreur du côté de mon programme boost.
Voici mon code C++ :
Et voici mon code Java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 #include <iostream> #include <boost/asio.hpp> #include <boost/array.hpp> #include <sstream> #include <iomanip> #include <fstream> #include <iostream> #include <stdlib.h> using boost::asio::ip::tcp; int TAILLE_BUFFER_MAX = 10; int main() { // Création du service principal et du résolveur boost::asio::io_service ios1, ios2; int tailleNomFic;; // On veut se connecter sur la machine locale, port 1706 tcp::endpoint endpoint1(boost::asio::ip::address::from_string("127.0.0.1"), 1706); tcp::endpoint endpoint2(boost::asio::ip::address::from_string("127.0.0.1"), 1704); // On crée une socket // (1) tcp::socket socket1(ios1); tcp::socket socket2(ios2); // Tentative de connexion, bloquante // (2) socket1.connect(endpoint1); socket2.connect(endpoint2); for(int i=0; i<TAILLE_BUFFER_MAX; i++) { tailleNomFic = i; tailleNomFic = ntohl(tailleNomFic); //envoi simple d'entier socket1.send(boost::asio::buffer(&tailleNomFic, sizeof(tailleNomFic))); //sleep(1); } //réception d'un entier int entier; for(int i=0; i<TAILLE_BUFFER_MAX; i++) { socket2.receive(boost::asio::buffer(&entier, sizeof(int))); std::cout << "test entier 2 "<< ntohl((int)entier) << std::endl; //sleep(1); } return 0; }
les messages d'erreurs sont :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 import java.io.*; import java.net.*; public class Socket { static final int port1 = 1706; static final int port2 = 1704; public static void main(String[] args) throws Exception { ServerSocket s1 = new ServerSocket(port1); java.net.Socket soc1= (java.net.Socket) s1.accept(); ServerSocket s2 = new ServerSocket(port2); java.net.Socket soc2= (java.net.Socket) s2.accept(); DataInputStream dis = new DataInputStream(soc1.getInputStream()); DataOutputStream dos = new DataOutputStream(soc2.getOutputStream()); int valeur = 100; for (int i = 0 ; i < 10 ; i++) { dos.writeInt(valeur); valeur--; } for (int i = 0 ; i < 10 ; i++) { int ci = dis.readInt(); System.out.println(ci); } dis.close(); dos.close(); soc1.close(); soc2.close(); } }
soit
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): Connection refused
Abandon
soit
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): Connection reset by peer
Abandon
Partager