Importation du code depuis GitHub
This commit is contained in:
commit
fca1caf5ea
4 changed files with 1043 additions and 0 deletions
3
README.md
Normal file
3
README.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Tsocks (Computer science lab)
|
||||
Here I share my own implementation of [Tsocks](http://tsocks.sourceforge.net/) in C carried out as part of the computer science work at INSA Toulouse.
|
||||
|
||||
274
tsock_v1_gasc_m.c
Normal file
274
tsock_v1_gasc_m.c
Normal file
|
|
@ -0,0 +1,274 @@
|
|||
/* librairie standard ... */
|
||||
#include <stdlib.h>
|
||||
/* pour getopt */
|
||||
#include <unistd.h>
|
||||
/* déclaration des types de base */
|
||||
#include <sys/types.h>
|
||||
/* constantes relatives aux domaines, types et protocoles */
|
||||
#include <sys/socket.h>
|
||||
/* constantes et structures propres au domaine UNIX */
|
||||
#include <sys/un.h>
|
||||
/* constantes et structures propres au domaine INTERNET */
|
||||
#include <netinet/in.h>
|
||||
/* structures retournées par les fonctions de gestion de la base de
|
||||
données du réseau */
|
||||
#include <netdb.h>
|
||||
/* pour les entrées/sorties */
|
||||
#include <stdio.h>
|
||||
/* pour la gestion des erreurs */
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
TP AIPS
|
||||
Version 1 - Fonctionnelle
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
// Fonctions d'erreurs
|
||||
/// Afficher l'usage et quitte
|
||||
void err_args() {
|
||||
printf("[!] Usage: cmd [-u][-p|-s][-n ##][-l ##]\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/// Affiche erreur socket
|
||||
void err_socks(){
|
||||
printf("\n[-] Erreur lors de la création/affectation du socket");
|
||||
}
|
||||
|
||||
/// Affiche erreur connexion
|
||||
void err_conn(){
|
||||
printf("\n[-] Erreur lors de la connexion serveur/client");
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Given functions
|
||||
void construire_message(char *message, char motif, int lg) {
|
||||
int i;
|
||||
for (i=0;i<lg;i++) message[i] = motif;
|
||||
}
|
||||
|
||||
void afficher_message(char *message, int lg) {
|
||||
int i;
|
||||
printf("[+] Message construit : ");
|
||||
for (i=0;i<lg;i++) printf("%c", message[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
///////////////////////////UDP/////////////////////////////
|
||||
|
||||
int source_UDP(char *HOSTNAME, int PORT, int nb_message, int l_msg) {
|
||||
// Création du socket UDP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
|
||||
|
||||
if (s_udp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
|
||||
// Création du socket distant
|
||||
printf("[+] Création du socket distant...");
|
||||
struct sockaddr_in servaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
struct hostent *hp ;
|
||||
|
||||
// Résolution du nom
|
||||
if ((hp = gethostbyname(HOSTNAME)) == NULL) {
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Creation de la struct du socket distant
|
||||
servaddr.sin_family = AF_INET;
|
||||
memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr, hp->h_length);
|
||||
servaddr.sin_port = PORT;
|
||||
printf("Ok!\n");
|
||||
|
||||
printf("[+] Envoi des messages à %s:%d...\n", HOSTNAME, PORT);
|
||||
|
||||
// TEST
|
||||
char *pmesg = malloc(l_msg*sizeof(char));
|
||||
char c = 'a';
|
||||
|
||||
// Création des messages à envoyer et envoi
|
||||
for (int i = 1; i <= nb_message; i++){
|
||||
construire_message(pmesg, c, l_msg);
|
||||
afficher_message(pmesg, l_msg);
|
||||
sendto(s_udp,
|
||||
pmesg,
|
||||
strlen(pmesg),
|
||||
0,
|
||||
(const struct sockaddr *) &servaddr,
|
||||
sizeof(servaddr)
|
||||
);
|
||||
c++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int puit_UDP(int PORT, int nb_message, int l_msg) {
|
||||
// Création du socket UDP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
|
||||
|
||||
if (s_udp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
struct sockaddr_in servaddr, cliaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
memset(&cliaddr, 0, sizeof(cliaddr));
|
||||
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_addr.s_addr = INADDR_ANY;
|
||||
servaddr.sin_port = PORT;
|
||||
|
||||
if ( bind(s_udp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
|
||||
err_socks();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Bind ok !\n");
|
||||
|
||||
int n;
|
||||
int len;
|
||||
int msg_count = 0;
|
||||
char buffer[l_msg];
|
||||
|
||||
printf("[+] Waiting for messages...\n");
|
||||
|
||||
while (msg_count >= nb_message || nb_message != -1){
|
||||
n = recvfrom(s_udp, (char *)buffer, l_msg,
|
||||
MSG_WAITALL, (struct sockaddr *) &cliaddr,
|
||||
&len);
|
||||
buffer[n] = '\0';
|
||||
printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
|
||||
|
||||
n = 0;
|
||||
msg_count++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
////////////////////////////TCP/////////////////////////////
|
||||
|
||||
int source_TCP(char *HOSTNAME, int PORT, int nb_message, int l_msg){
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int puit_TCP(int PORT, int nb_message, int l_msg){
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
/// Main entry
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
|
||||
int source = -1; /* 0 = puits, 1 = source */
|
||||
int tcp = 1; /* 0 = UDP, 1 = TCP */
|
||||
int l_msg = 30; /* longueur du message, en octet. Defaut : 30. */
|
||||
|
||||
while ((c = getopt(argc, argv, "pn:sul:")) != -1) {
|
||||
switch (c) {
|
||||
case 'p':
|
||||
if (source == 1) {
|
||||
err_args();
|
||||
}
|
||||
source = 0;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
if (source == 0) {
|
||||
err_args();
|
||||
}
|
||||
source = 1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
nb_message = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
tcp = 0;
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
l_msg = atoi(optarg);
|
||||
|
||||
default:
|
||||
err_args();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int PORT = atoi(argv[argc-1]);
|
||||
//PORT = htons(PORT);
|
||||
|
||||
if (source == -1) {
|
||||
err_args();
|
||||
}
|
||||
|
||||
if (tcp)
|
||||
printf("[+] On utilise le protocol TCP\n");
|
||||
else
|
||||
printf("[+] On utilise le protocol UDP\n");
|
||||
|
||||
|
||||
char* HOSTNAME = "";
|
||||
if (source == 1){
|
||||
printf("[+] On est dans la source\n");
|
||||
HOSTNAME = argv[argc-2];
|
||||
}
|
||||
else
|
||||
printf("[+] On est dans le puit\n");
|
||||
|
||||
if (nb_message != -1) {
|
||||
if (source == 1)
|
||||
printf("[+] Nombre de tampons à envoyer : %d\n", nb_message);
|
||||
else
|
||||
printf("[+] Nombre de tampons à recevoir : %d\n", nb_message);
|
||||
} else {
|
||||
if (source == 1) {
|
||||
nb_message = 10 ;
|
||||
printf("[~] Nombre de tampons à envoyer = 10 par défaut\n");
|
||||
}
|
||||
else
|
||||
printf("[+] Nombre de tampons à envoyer = infini\n");
|
||||
}
|
||||
|
||||
if (l_msg == 30)
|
||||
printf("[~] Longueur des messages à envoyer/recevoir : 30 par défaut\n");
|
||||
else
|
||||
printf("[+] Nombre de tampons à envoyer/recevoir : %d \n", l_msg);
|
||||
|
||||
int s = 1;
|
||||
|
||||
// Choose the right function
|
||||
if (tcp){
|
||||
if (source) s = source_TCP(HOSTNAME, PORT, nb_message, l_msg);
|
||||
else s = puit_TCP(PORT, nb_message, l_msg);
|
||||
}
|
||||
else {
|
||||
if (source) s = source_UDP(HOSTNAME, PORT, nb_message, l_msg);
|
||||
else s = puit_UDP(PORT, nb_message, l_msg);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
379
tsock_v2_gasc_m.c
Normal file
379
tsock_v2_gasc_m.c
Normal file
|
|
@ -0,0 +1,379 @@
|
|||
/* librairie standard ... */
|
||||
#include <stdlib.h>
|
||||
/* pour getopt */
|
||||
#include <unistd.h>
|
||||
/* déclaration des types de base */
|
||||
#include <sys/types.h>
|
||||
/* constantes relatives aux domaines, types et protocoles */
|
||||
#include <sys/socket.h>
|
||||
/* constantes et structures propres au domaine UNIX */
|
||||
#include <sys/un.h>
|
||||
/* constantes et structures propres au domaine INTERNET */
|
||||
#include <netinet/in.h>
|
||||
/* structures retournées par les fonctions de gestion de la base de
|
||||
données du réseau */
|
||||
#include <netdb.h>
|
||||
/* pour les entrées/sorties */
|
||||
#include <stdio.h>
|
||||
/* pour la gestion des erreurs */
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
TP AIPS
|
||||
Version 2 - FONCTIONNELLE
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
// Fonctions d'erreurs
|
||||
/// Afficher l'usage et quitte
|
||||
void err_args() {
|
||||
printf("[!] Usage: cmd [-u][-p|-s][-n ##][-l ##]\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/// Affiche erreur socket
|
||||
void err_socks(){
|
||||
printf("\n[-] Erreur lors de la création/affectation du socket\n");
|
||||
}
|
||||
|
||||
/// Affiche erreur connexion
|
||||
void err_conn(){
|
||||
printf("\n[-] Erreur lors de la connexion serveur/client\n");
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Given functions
|
||||
void construire_message(char *message, char motif, int lg) {
|
||||
int i;
|
||||
for (i=0;i<lg;i++) message[i] = motif;
|
||||
}
|
||||
|
||||
void afficher_message(char *message, int lg) {
|
||||
int i;
|
||||
printf("[+] Message construit : ");
|
||||
for (i=0;i<lg;i++) printf("%c", message[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
///////////////////////////UDP/////////////////////////////
|
||||
|
||||
int source_UDP(char *HOSTNAME, int PORT, int nb_message, int l_msg) {
|
||||
// Création du socket UDP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
|
||||
|
||||
if (s_udp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
|
||||
// Création du socket distant
|
||||
printf("[+] Création du socket distant...");
|
||||
struct sockaddr_in servaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
struct hostent *hp ;
|
||||
|
||||
// Résolution du nom
|
||||
if ((hp = gethostbyname(HOSTNAME)) == NULL) {
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Creation de la struct du socket distant
|
||||
servaddr.sin_family = AF_INET;
|
||||
memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr, hp->h_length);
|
||||
servaddr.sin_port = PORT;
|
||||
printf("Ok!\n");
|
||||
|
||||
printf("[+] Envoi des messages à %s:%d...\n", HOSTNAME, PORT);
|
||||
|
||||
// TEST
|
||||
char *pmesg = malloc(l_msg*sizeof(char));
|
||||
char c = 'a';
|
||||
|
||||
// Création des messages à envoyer et envoi
|
||||
for (int i = 1; i <= nb_message; i++){
|
||||
construire_message(pmesg, c, l_msg);
|
||||
afficher_message(pmesg, l_msg);
|
||||
sendto(s_udp,
|
||||
pmesg,
|
||||
strlen(pmesg),
|
||||
0,
|
||||
(const struct sockaddr *) &servaddr,
|
||||
sizeof(servaddr)
|
||||
);
|
||||
c++;
|
||||
if (c >= '{') c = 'a';
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int puit_UDP(int PORT, int nb_message, int l_msg) {
|
||||
// Création du socket UDP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
|
||||
|
||||
if (s_udp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
struct sockaddr_in servaddr, cliaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
memset(&cliaddr, 0, sizeof(cliaddr));
|
||||
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_addr.s_addr = INADDR_ANY;
|
||||
servaddr.sin_port = PORT;
|
||||
|
||||
if ( bind(s_udp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
|
||||
err_socks();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Bind ok !\n");
|
||||
|
||||
int n;
|
||||
int len;
|
||||
int msg_count = 0;
|
||||
char buffer[l_msg];
|
||||
|
||||
printf("[+] Waiting for messages...\n");
|
||||
|
||||
while (msg_count >= nb_message || nb_message != -1){
|
||||
n = recvfrom(s_udp, (char *)buffer, l_msg,
|
||||
MSG_WAITALL, (struct sockaddr *) &cliaddr,
|
||||
&len);
|
||||
buffer[n] = '\0';
|
||||
printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
|
||||
|
||||
n = 0;
|
||||
msg_count++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
////////////////////////////TCP/////////////////////////////
|
||||
|
||||
int source_TCP(char *HOSTNAME, int PORT, int nb_message, int l_msg){
|
||||
// Création du socket TCP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
|
||||
|
||||
if (s_tcp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
// Création du socket distant
|
||||
printf("[+] Création du socket distant...");
|
||||
struct sockaddr_in servaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
struct hostent *hp ;
|
||||
|
||||
// Résolution du nom
|
||||
if ((hp = gethostbyname(HOSTNAME)) == NULL) {
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Creation de la struct du socket distant
|
||||
servaddr.sin_family = AF_INET;
|
||||
memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr, hp->h_length);
|
||||
servaddr.sin_port = PORT;
|
||||
printf("Ok!\n");
|
||||
|
||||
if (connect(s_tcp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
printf("[+] Envoi des messages...\n");
|
||||
|
||||
// TEST
|
||||
char *pmesg = malloc(l_msg*sizeof(char));
|
||||
char c = 'a';
|
||||
|
||||
// Création des messages à envoyer et envoi
|
||||
for (int i = 1; i <= nb_message; i++){
|
||||
construire_message(pmesg, c, l_msg);
|
||||
afficher_message(pmesg, l_msg);
|
||||
if (write(s_tcp, pmesg, l_msg) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
c++;
|
||||
if (c >= '{') c = 'a';
|
||||
}
|
||||
|
||||
close(s_tcp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int puit_TCP(int PORT, int nb_message, int l_msg){
|
||||
// Création du socket TCP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
|
||||
|
||||
if (s_tcp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
struct sockaddr_in servaddr, cliaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
memset(&cliaddr, 0, sizeof(cliaddr));
|
||||
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_addr.s_addr = INADDR_ANY;
|
||||
servaddr.sin_port = PORT;
|
||||
|
||||
if (bind(s_tcp, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
|
||||
err_socks();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Bind ok !\n");
|
||||
|
||||
if (listen(s_tcp, 5) != 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Listening on port %d\n", PORT);
|
||||
|
||||
int s_conn, l_recpt, msg_count = 1;
|
||||
int lg_cliaddr = sizeof(cliaddr);
|
||||
|
||||
if ((s_conn = accept(s_tcp, (struct sockaddr *)&cliaddr, &lg_cliaddr)) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Connection accepted\n");
|
||||
|
||||
|
||||
int n;
|
||||
char buffer[l_msg];
|
||||
|
||||
printf("[+] Waiting for messages...\n");
|
||||
|
||||
while (msg_count <= nb_message || nb_message == -1){
|
||||
if ((l_recpt = read(s_conn, buffer, sizeof(buffer))) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
if (l_recpt > 0){
|
||||
printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
|
||||
|
||||
n = 0;
|
||||
msg_count++;
|
||||
bzero(buffer, l_msg);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
/// Main entry
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
|
||||
int source = -1; /* 0 = puits, 1 = source */
|
||||
int tcp = 1; /* 0 = UDP, 1 = TCP */
|
||||
int l_msg = 30; /* longueur du message, en octet. Defaut : 30. */
|
||||
|
||||
while ((c = getopt(argc, argv, "pn:su")) != -1) {
|
||||
switch (c) {
|
||||
case 'p':
|
||||
if (source == 1) {
|
||||
err_args();
|
||||
}
|
||||
source = 0;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
if (source == 0) {
|
||||
err_args();
|
||||
}
|
||||
source = 1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
nb_message = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
tcp = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
err_args();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int PORT = atoi(argv[argc-1]);
|
||||
//PORT = htons(PORT);
|
||||
|
||||
if (source == -1) {
|
||||
err_args();
|
||||
}
|
||||
|
||||
if (tcp)
|
||||
printf("[+] On utilise le protocol TCP\n");
|
||||
else
|
||||
printf("[+] On utilise le protocol UDP\n");
|
||||
|
||||
|
||||
char* HOSTNAME = "";
|
||||
if (source == 1){
|
||||
printf("[+] On est dans la source\n");
|
||||
HOSTNAME = argv[argc-2];
|
||||
}
|
||||
else
|
||||
printf("[+] On est dans le puit\n");
|
||||
|
||||
if (nb_message != -1) {
|
||||
if (source == 1)
|
||||
printf("[+] Nombre de tampons à envoyer : %d\n", nb_message);
|
||||
else
|
||||
printf("[+] Nombre de tampons à recevoir : %d\n", nb_message);
|
||||
} else {
|
||||
if (source == 1) {
|
||||
nb_message = 10 ;
|
||||
printf("[~] Nombre de tampons à envoyer : 10 par défaut\n");
|
||||
}
|
||||
else
|
||||
printf("[+] Nombre de tampons à envoyer : infini\n");
|
||||
}
|
||||
|
||||
if (l_msg == 30)
|
||||
printf("[~] Longueur des messages à envoyer/recevoir : 30 par défaut\n");
|
||||
else
|
||||
printf("[+] Nombre de tampons à envoyer/recevoir : %d \n", l_msg);
|
||||
|
||||
int s = 1;
|
||||
|
||||
// Choose the right function
|
||||
if (tcp){
|
||||
if (source) s = source_TCP(HOSTNAME, PORT, nb_message, l_msg);
|
||||
else s = puit_TCP(PORT, nb_message, l_msg);
|
||||
}
|
||||
else {
|
||||
if (source) s = source_UDP(HOSTNAME, PORT, nb_message, l_msg);
|
||||
else s = puit_UDP(PORT, nb_message, l_msg);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
387
tsock_v3_gasc_m.c
Normal file
387
tsock_v3_gasc_m.c
Normal file
|
|
@ -0,0 +1,387 @@
|
|||
/* librairie standard ... */
|
||||
#include <stdlib.h>
|
||||
/* pour getopt */
|
||||
#include <unistd.h>
|
||||
/* déclaration des types de base */
|
||||
#include <sys/types.h>
|
||||
/* constantes relatives aux domaines, types et protocoles */
|
||||
#include <sys/socket.h>
|
||||
/* constantes et structures propres au domaine UNIX */
|
||||
#include <sys/un.h>
|
||||
/* constantes et structures propres au domaine INTERNET */
|
||||
#include <netinet/in.h>
|
||||
/* structures retournées par les fonctions de gestion de la base de
|
||||
données du réseau */
|
||||
#include <netdb.h>
|
||||
/* pour les entrées/sorties */
|
||||
#include <stdio.h>
|
||||
/* pour la gestion des erreurs */
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
TP AIPS
|
||||
Version 3 alpha - NON COMPLETE
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
// Fonctions d'erreurs
|
||||
/// Afficher l'usage et quitte
|
||||
void err_args() {
|
||||
printf("[!] Usage: cmd [-u][-p|-s][-n ##][-l ##]\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/// Affiche erreur socket
|
||||
void err_socks(){
|
||||
printf("\n[-] Erreur lors de la création/affectation du socket\n");
|
||||
}
|
||||
|
||||
/// Affiche erreur connexion
|
||||
void err_conn(){
|
||||
printf("\n[-] Erreur lors de la connexion serveur/client\n");
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Given functions
|
||||
void construire_message(char *message, char motif, int lg, int numero) {
|
||||
int i;
|
||||
char str[5];
|
||||
for (i=0;i<5;++i) str[i] = '-';
|
||||
sprintf(str, "%5d", numero);
|
||||
for (i=0;i<lg;i++) message[i] = motif;
|
||||
for (i=0;i<5;++i) message[i] = str[i];
|
||||
}
|
||||
|
||||
void afficher_message(char *message, int lg) {
|
||||
int i;
|
||||
printf("[+] Message construit : ");
|
||||
for (i=0;i<lg;i++) printf("%c", message[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
///////////////////////////UDP/////////////////////////////
|
||||
|
||||
int source_UDP(char *HOSTNAME, int PORT, int nb_message, int l_msg) {
|
||||
// Création du socket UDP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
|
||||
|
||||
if (s_udp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
|
||||
// Création du socket distant
|
||||
printf("[+] Création du socket distant...");
|
||||
struct sockaddr_in servaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
struct hostent *hp ;
|
||||
|
||||
// Résolution du nom
|
||||
if ((hp = gethostbyname(HOSTNAME)) == NULL) {
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Creation de la struct du socket distant
|
||||
servaddr.sin_family = AF_INET;
|
||||
memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr_list[0], hp->h_length);
|
||||
servaddr.sin_port = PORT;
|
||||
printf("Ok!\n");
|
||||
|
||||
printf("[+] Envoi des messages à %s:%d...\n", HOSTNAME, PORT);
|
||||
|
||||
// TEST
|
||||
char *pmesg = malloc(l_msg*sizeof(char));
|
||||
char c = 'a';
|
||||
|
||||
// Création des messages à envoyer et envoi
|
||||
for (int i = 1; i <= nb_message; i++){
|
||||
construire_message(pmesg, c, l_msg, i);
|
||||
afficher_message(pmesg, l_msg);
|
||||
sendto(s_udp,
|
||||
pmesg,
|
||||
strlen(pmesg),
|
||||
0,
|
||||
(const struct sockaddr *) &servaddr,
|
||||
sizeof(servaddr)
|
||||
);
|
||||
c++;
|
||||
if (c >= '{') c = 'a';
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int puit_UDP(int PORT, int nb_message, int l_msg) {
|
||||
// Création du socket UDP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
|
||||
|
||||
if (s_udp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
struct sockaddr_in servaddr, cliaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
memset(&cliaddr, 0, sizeof(cliaddr));
|
||||
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_addr.s_addr = INADDR_ANY;
|
||||
servaddr.sin_port = PORT;
|
||||
|
||||
if ( bind(s_udp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
|
||||
err_socks();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Bind ok !\n");
|
||||
|
||||
int n;
|
||||
int len;
|
||||
int msg_count = 0;
|
||||
char buffer[l_msg];
|
||||
|
||||
printf("[+] Waiting for messages...\n");
|
||||
|
||||
while (msg_count >= nb_message || nb_message != -1){
|
||||
n = recvfrom(s_udp, (char *)buffer, l_msg,
|
||||
MSG_WAITALL, (struct sockaddr *) &cliaddr,
|
||||
&len);
|
||||
buffer[n] = '\0';
|
||||
printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
|
||||
|
||||
n = 0;
|
||||
msg_count++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
////////////////////////////TCP/////////////////////////////
|
||||
|
||||
int source_TCP(char *HOSTNAME, int PORT, int nb_message, int l_msg){
|
||||
// Création du socket TCP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
|
||||
|
||||
if (s_tcp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
// Création du socket distant
|
||||
printf("[+] Création du socket distant...");
|
||||
struct sockaddr_in servaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
struct hostent *hp ;
|
||||
|
||||
// Résolution du nom
|
||||
if ((hp = gethostbyname(HOSTNAME)) == NULL) {
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Creation de la struct du socket distant
|
||||
servaddr.sin_family = AF_INET;
|
||||
memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr_list[0], hp->h_length);
|
||||
servaddr.sin_port = PORT;
|
||||
printf("Ok!\n");
|
||||
|
||||
if (connect(s_tcp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
printf("[+] Envoi des messages...\n");
|
||||
|
||||
// TEST
|
||||
char *pmesg = malloc(l_msg*sizeof(char));
|
||||
char c = 'a';
|
||||
|
||||
// Création des messages à envoyer et envoi
|
||||
for (int i = 1; i <= nb_message; i++){
|
||||
construire_message(pmesg, c, l_msg, i);
|
||||
afficher_message(pmesg, l_msg);
|
||||
if (write(s_tcp, pmesg, l_msg) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
c++;
|
||||
if (c >= '{') c = 'a';
|
||||
}
|
||||
|
||||
close(s_tcp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int puit_TCP(int PORT, int nb_message, int l_msg){
|
||||
// Création du socket TCP
|
||||
printf("[+] Création du socket local...");
|
||||
int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
|
||||
|
||||
if (s_tcp == -1){
|
||||
err_socks();
|
||||
return 1;
|
||||
} else printf("Ok!\n");
|
||||
|
||||
struct sockaddr_in servaddr, cliaddr;
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
memset(&cliaddr, 0, sizeof(cliaddr));
|
||||
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_addr.s_addr = INADDR_ANY;
|
||||
servaddr.sin_port = PORT;
|
||||
|
||||
if (bind(s_tcp, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
|
||||
err_socks();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Bind ok !\n");
|
||||
|
||||
if (listen(s_tcp, 5) != 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Listening on port %d\n", PORT);
|
||||
|
||||
int s_conn, l_recpt, msg_count = 1;
|
||||
int lg_cliaddr = sizeof(cliaddr);
|
||||
|
||||
if ((s_conn = accept(s_tcp, (struct sockaddr *)&cliaddr, &lg_cliaddr)) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
printf("[+] Connection accepted\n");
|
||||
|
||||
|
||||
int n;
|
||||
char buffer[l_msg];
|
||||
|
||||
printf("[+] Waiting for messages...\n");
|
||||
|
||||
while (msg_count <= nb_message || nb_message == -1){
|
||||
if ((l_recpt = read(s_conn, buffer, sizeof(buffer))) < 0){
|
||||
err_conn();
|
||||
return 1;
|
||||
}
|
||||
if (l_recpt > 0){
|
||||
printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
|
||||
|
||||
n = 0;
|
||||
msg_count++;
|
||||
bzero(buffer, l_msg);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
/// Main entry
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
|
||||
int source = -1; /* 0 = puits, 1 = source */
|
||||
int tcp = 1; /* 0 = UDP, 1 = TCP */
|
||||
int l_msg = 30; /* longueur du message, en octet. Defaut : 30. */
|
||||
|
||||
while ((c = getopt(argc, argv, "pn:sul:")) != -1) {
|
||||
switch (c) {
|
||||
case 'p':
|
||||
if (source == 1) {
|
||||
err_args();
|
||||
}
|
||||
source = 0;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
if (source == 0) {
|
||||
err_args();
|
||||
}
|
||||
source = 1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
nb_message = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
tcp = 0;
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
l_msg = atoi(optarg) + 5;
|
||||
break;
|
||||
|
||||
default:
|
||||
err_args();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int PORT = atoi(argv[argc-1]);
|
||||
//PORT = htons(PORT);
|
||||
|
||||
if (source == -1) {
|
||||
err_args();
|
||||
}
|
||||
|
||||
if (tcp)
|
||||
printf("[+] On utilise le protocol TCP\n");
|
||||
else
|
||||
printf("[+] On utilise le protocol UDP\n");
|
||||
|
||||
|
||||
char* HOSTNAME = "";
|
||||
if (source == 1){
|
||||
printf("[+] On est dans la source\n");
|
||||
HOSTNAME = argv[argc-2];
|
||||
}
|
||||
else
|
||||
printf("[+] On est dans le puit\n");
|
||||
|
||||
if (nb_message != -1) {
|
||||
if (source == 1)
|
||||
printf("[+] Nombre de tampons à envoyer : %d\n", nb_message);
|
||||
else
|
||||
printf("[+] Nombre de tampons à recevoir : %d\n", nb_message);
|
||||
} else {
|
||||
if (source == 1) {
|
||||
nb_message = 10 ;
|
||||
printf("[~] Nombre de tampons à envoyer : 10 par défaut\n");
|
||||
}
|
||||
else
|
||||
printf("[+] Nombre de tampons à envoyer : infini\n");
|
||||
}
|
||||
|
||||
if (l_msg == 30)
|
||||
printf("[~] Longueur des messages à envoyer/recevoir : 30 par défaut\n");
|
||||
else
|
||||
printf("[+] Nombre de tampons à envoyer/recevoir : %d \n", l_msg);
|
||||
|
||||
int s = 1;
|
||||
|
||||
// Choose the right function
|
||||
if (tcp){
|
||||
if (source) s = source_TCP(HOSTNAME, PORT, nb_message, l_msg);
|
||||
else s = puit_TCP(PORT, nb_message, l_msg);
|
||||
}
|
||||
else {
|
||||
if (source) s = source_UDP(HOSTNAME, PORT, nb_message, l_msg);
|
||||
else s = puit_UDP(PORT, nb_message, l_msg);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
Loading…
Reference in a new issue