summaryrefslogtreecommitdiff
path: root/i/simulotron
diff options
context:
space:
mode:
Diffstat (limited to 'i/simulotron')
-rw-r--r--i/simulotron/src/socket/Makefile.incl.am1
-rw-r--r--i/simulotron/src/socket/socket.cc27
-rw-r--r--i/simulotron/src/socket/socket.hh2
-rw-r--r--i/simulotron/src/socket/test_socket.cc166
4 files changed, 132 insertions, 64 deletions
diff --git a/i/simulotron/src/socket/Makefile.incl.am b/i/simulotron/src/socket/Makefile.incl.am
index 7b16a9f..a554b58 100644
--- a/i/simulotron/src/socket/Makefile.incl.am
+++ b/i/simulotron/src/socket/Makefile.incl.am
@@ -3,3 +3,4 @@ socket_S = socket/socket.cc socket/socket.hh $(address_S) $(errno_exception_S)
check_PROGRAMS += test_socket
test_socket_SOURCES = socket/test_socket.cc $(socket_S)
+test_socket_LDFLAGS = -pthread
diff --git a/i/simulotron/src/socket/socket.cc b/i/simulotron/src/socket/socket.cc
index 8b0ef99..b696690 100644
--- a/i/simulotron/src/socket/socket.cc
+++ b/i/simulotron/src/socket/socket.cc
@@ -1,5 +1,6 @@
#include <sys/socket.h>
#include <cerrno>
+#include <iostream>
#include "socket/socket.hh"
#include "utils/errno_exception.hh"
#include "socket/address.hh"
@@ -23,12 +24,13 @@ Socket::Socket(int socket)
Socket::~Socket(void)
{
- close(socket_);
+ // XXX Pas faisable car les copy détruise les socket
+ //close(socket_);
}
void Socket::connect(const Address & address)
{
- if (::connect (socket_, address.getSockaddr(), sizeof(*address.getSockaddr()) < 0))
+ if (::connect (socket_, address.getSockaddr(), sizeof(sockaddr_in)) < 0)
throw errno_exception("Impossible de mettre la chaussette", errno);
}
@@ -41,27 +43,33 @@ void Socket::listen(int maxQueue)
Socket Socket::accept(Address & address)
{
sockaddr addr;
- socklen_t length;
-
+ socklen_t length = sizeof(sockaddr_in);
+
int socket = ::accept(socket_, &addr, &length);
if (socket < 0)
throw errno_exception("Chaussette bloqué à la douane", errno);
address = Address(&addr, length);
-
+
return Socket(socket);
}
+void Socket::close(void)
+{
+ ::close(socket_);
+}
+
std::string Socket::read(void)
{
std::string str;
int charReaded;
char buffer[BUFFER_SIZE];
-
do
{
charReaded = ::read(socket_, buffer, BUFFER_SIZE - 1);
- buffer[charReaded + 1] = 0;
+ if(charReaded < 0)
+ throw errno_exception("Socket: problème de lecture", errno);
+ buffer[charReaded] = 0;
str += buffer;
}while(charReaded == BUFFER_SIZE - 1);
return str;
@@ -71,6 +79,7 @@ void Socket::write(const std::string & str)
{
char buffer[BUFFER_SIZE];
unsigned int pos = 0;
+ int retval = 0;
while(str.size() != pos)
{
@@ -78,7 +87,9 @@ void Socket::write(const std::string & str)
str.copy(buffer, size, pos);
pos += size;
buffer[size] = 0;
- ::write(socket_, buffer, size);
+ retval = ::write(socket_, buffer, size);
+ if(retval < 0)
+ throw errno_exception("Socket: erreur d'écriture (write()) ", errno);
}
}
diff --git a/i/simulotron/src/socket/socket.hh b/i/simulotron/src/socket/socket.hh
index a1d6d65..3d054fa 100644
--- a/i/simulotron/src/socket/socket.hh
+++ b/i/simulotron/src/socket/socket.hh
@@ -22,6 +22,8 @@ class Socket
void listen(int maxQueue);
/// accepte une connection
Socket accept(Address & address);
+ /// coupe la chaussette
+ void Socket::close(void);
/// lit du socket
std::string read(void);
/// écrit dans le socket
diff --git a/i/simulotron/src/socket/test_socket.cc b/i/simulotron/src/socket/test_socket.cc
index 67ff638..4a44e6e 100644
--- a/i/simulotron/src/socket/test_socket.cc
+++ b/i/simulotron/src/socket/test_socket.cc
@@ -1,74 +1,128 @@
#include "socket/socket.hh"
#include "socket/address.hh"
+#include "utils/errno_exception.hh"
#include <iostream>
-int main(void)
-{
- Address adr;
- Address adr2;
- // Création de deux socket;
- Socket sockServ(Address(4242));
- Socket sockClient(adr);
-
- // Mise en écoute du socket serveur
- sockServ.listen(12);
+// Adress useful
+Address adr;
+Address adr2;
+//Chaine et char de test
+const std::string strDepart = "J'aime la prog système.";
+std::string strDest;
+const char a = 'f';
+char b;
+//threads
+pthread_t threadId[2];
+void * retour;
+int stateTh[2];
- // Demande de connection
- sockClient.connect(Address(std::string("localhost"), 4242));
- Socket sockFork = sockServ.accept(adr2);
- //TODO if(adr != adr2)
- //{
-// std::cout << "L'adresse du client et l'adresse retourné par le accept sont différentes !!!" << std:endl;
-// return 1;
- // }
+void * testSockServ(void * CaSertARien);
+void * testSockClient(void * CaSertARien);
- // Ecriture du client dans le serveur
- std::string strDepart = "J'aime la prog système.";
- std::string strDest;
-
- sockClient.write(strDepart);
- strDest = sockFork.read();
-
- if(strDepart != strDest)
+int main(void)
+{
+ int ret;
+ ret = pthread_create(& threadId[0], NULL, testSockServ, NULL);
+ if(ret != 0)
{
- std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du client au serveur!!" << std::endl;
- return 1;
+ std::cout << "CHIER: Echec thread serveur" << std::endl;
+ return EXIT_FAILURE;
}
-
- // Ecriture du serveur au client
- sockFork.write(strDepart);
- strDest = sockClient.read();
-
- if(strDepart != strDest)
+ ret = pthread_create(& threadId[1], NULL, testSockClient, NULL);
+ if(ret != 0)
{
- std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du serveur au client!!" << std::endl;
- return 1;
+ std::cout << "CHIER: Echec thread client" << std::endl;
+ return EXIT_FAILURE;
}
+ pthread_join(threadId[0], &retour);
+ stateTh[0] = (int) retour;
+ pthread_join(threadId[1], &retour);
+ stateTh[1] = (int) retour;
+ if(stateTh[0] == 0 && stateTh[1] == 0)
+ return 0;
+ else
+ return 1;
+}
- // Ecriture d'un char du client au serveur
- char a = 'f';
- char b;
-
- sockClient.putChar(a);
- b = sockFork.getChar();
-
- if(a != b)
+void * testSockServ(void * CaSertARien)
+{
+ try
{
- std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du client au serveur!!" << std::endl;
- return 1;
+ // Création de la socket serveur;
+ Socket sockServ(Address(4242));
+ // Mise en écoute du socket serveur
+ sockServ.listen(12);
+ // Acceptation d'une connection
+ Socket sockFork = sockServ.accept(adr2);
+ // Reception d'un message
+ strDest = sockFork.read();
+ if(strDepart != strDest)
+ {
+ std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du client au serveur!!" << std::endl;
+ std::cout << "Le message d'origine: " << strDepart << std::endl;
+ std::cout << "Message reçu: " << std::endl;
+ return (void *) 1;
+ }
+ // Ecriture du serveur au client
+ sockFork.write(strDepart);
+ // Reception d'un char
+ b = sockFork.getChar();
+ if(a != b)
+ {
+ std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du client au serveur!!" << std::endl;
+ std::cout << "Le char d'origine: " << a << std::endl;
+ std::cout << "Le char d'arrivé: " << b << std::endl;
+ return (void *) 1;
+ }
+ // Ecriture du serveur vers le client
+ sockFork.putChar(a);
}
-
- // Ecriture du serveur vers le client
- sockFork.putChar(a);
- b = sockClient.getChar();
-
- if(a != b)
+ catch(errno_exception & chier)
{
- std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du serveur au client!!" << std::endl;
- return 1;
+ std::cout << "CHIER !! Une exception a été lancé coté serveur!!" << std::endl;
+ std::cout << chier.what() << std::endl;
+ return (void *) 1;
}
-
+ return (void *) 0;
+}
- return 0;
+void * testSockClient(void * CaSertARien)
+{
+ try
+ {
+ // Création de la socket client
+ Socket sockClient(adr);
+ // Demande de connection
+ sockClient.connect(Address(std::string("localhost"), 4242));
+ // Ecriture du client dans le serveur
+ sockClient.write(strDepart);
+ // Reception du message serveur
+ strDest = sockClient.read();
+ if(strDepart != strDest)
+ {
+ std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du serveur au client!!" << std::endl;
+ std::cout << "Le message d'origine: " << strDepart << std::endl;
+ std::cout << "Message reçu: " << std::endl;
+ return (void *) 1;
+ }
+ // Ecriture d'un char du client au serveur
+ sockClient.putChar(a);
+ // Reception d'un char
+ b = sockClient.getChar();
+ if(a != b)
+ {
+ std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du serveur au client!!" << std::endl;
+ std::cout << "Le char d'origine: " << a << std::endl;
+ std::cout << "Le char d'arrivé: " << b << std::endl;
+ return (void *) 1;
+ }
+ }
+ catch(errno_exception & chier)
+ {
+ std::cout << "CHIER !! Une exception a été lancé coté client!!" << std::endl;
+ std::cout << chier.what() << std::endl;
+ return (void *) 1;
+ }
+ return (void *) 0;
}