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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
| #include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <string>
#include "vTCP.h"
#define VSOCKET_BUFFER_SIZE 16 //taille des buffer pour l'echange de donnees
/* __________
__________/ vSocket \_________________________________________*/
/**
CONSTRUCTEUR
@param: adresse ip
@param: port
*/
vSocket::vSocket(std::string ip,int port)
{
//on initialise winsock
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
if(ip=="INADDR_ANY")
{
/*selectionne automatiquement l'ip de la machine sur
laquelle tourne le programme*/
_sin.sin_addr.s_addr=htonl(INADDR_ANY);
}
else
{
//l'ip est spécifiée
_sin.sin_addr.s_addr=inet_addr(ip.c_str());
}
_sin.sin_family = AF_INET;
_sin.sin_port = htons(port);
_sock = socket(AF_INET,SOCK_STREAM,0);
std::cout<<"sock initialise a : "<<_sock<<std::endl;//DEBUGAGE
bind(_sock, (SOCKADDR *)&_sin, sizeof(_sin));
std::cout<<"sock apres bind : "<<_sock<<std::endl;//DEBUGAGE
}
/**
CONSTRUCTEUR PAR DEFAUT
@param: port
*/
vSocket::vSocket()
{
_sock=0;
std::cout<<"Appel du constructeur par defaut du SOCKET"<<std::endl;//DEBUGAGE
}
/**
CONSTRUCTEUR
@param: port
*/
vSocket::vSocket(int port)
{
vSocket("INADDR_ANY",port);
}
/**
ACCESSEUR
@return: le socket de l'objet
*/
const SOCKET& vSocket::getSocket()
{
return _sock;
}
/**
ACCESSEUR
@return: la structure sockaddr_in de l'objet
*/
const SOCKADDR_IN& vSocket::getSockaddr_in()
{
return _sin;
}
/**
METHODE STATIC
@param: le socket sur lequel on souhaite envoyer les donnees
@param: les donnees sous la forme d'une chaine
@return: true si les donnees ont ete correctement envoyees
*/
bool vSocket::envoyerDonnees(SOCKET sock,std::string donnees)
{
return (send(sock, donnees.c_str(), strlen(donnees.c_str()), 0)!=-1);
}
/**
METHODE STATIC
@param: le socket a partir duquel on souhaite recevoir les donnees
@return: une chaine contenant les donnees receptionnees
*/
std::string vSocket::recevoirDonnees(SOCKET sock)
{
char buffer[VSOCKET_BUFFER_SIZE]; //buffer temporaire
int size; //taille des données reçues à chaque recv
std::string donneesRecues=""; //concatene les donnees recues
while((size=recv(sock, buffer, VSOCKET_BUFFER_SIZE-1, 0))>0)
{
buffer[size] = '\0'; //on replace l'indicateur de fin de chaine au bon endroit
donneesRecues+=buffer; //on ajoute le contenu du buffer a la chaine qui sera retournee
}
return donneesRecues;
}
/* ______________
__________/ vServeurTCP \_________________________________________*/
vServeurTCP::vServeurTCP() : vSocket()
{
std::cout<<"Appel du constructeur par defaut du SERVEUR"<<std::endl;//DEBUGAGE
}
vServeurTCP::vServeurTCP(const int port) : vSocket(port)
{
SOCKET sockClient=0;
SOCKADDR_IN sinClient;
int sinSizeClient;
std::cout<<"sock avant listen : "<<getSocket()<<std::endl;//DEBUGAGE
listen(getSocket(),0);
sinSizeClient=sizeof(sinClient);
while(1)
{
sockClient=accept(getSocket(),(SOCKADDR*)&sinClient, &sinSizeClient);
if (sockClient!=INVALID_SOCKET)
{
std::cout<<"recoit des donnees"<<std::endl;
std::string msg;
msg=vSocket::recevoirDonnees(sockClient);
std::cout<<msg<<std::endl;
}
//std::cout<<sockClient<<std::endl;
}
}
/* _____________
__________/ vClientTCP \_________________________________________*/
vClientTCP::vClientTCP(std::string ip,int port) : vSocket(ip,port)
{
connect(getSocket(), (SOCKADDR *)&getSockaddr_in(), sizeof(getSockaddr_in()));
vSocket::envoyerDonnees(getSocket(),"toto va en chine");
} |
Partager