tsock with the start of v1
This commit is contained in:
parent
388ae6f68a
commit
82e2e44518
1 changed files with 198 additions and 0 deletions
198
tsock_v0.c
Normal file
198
tsock_v0.c
Normal file
|
@ -0,0 +1,198 @@
|
|||
/* 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>
|
||||
|
||||
#define DEFAULTPORT 9000
|
||||
#define MSG_LENGTH 10
|
||||
|
||||
void usage(char* prog) {
|
||||
printf("usage: %s [-p|-s][-u][-n ##]\n", prog);
|
||||
}
|
||||
|
||||
void construire_message(char* message, char motif, int lg) {
|
||||
for (int i = 0; i < lg; ++i) {
|
||||
message[i] = motif;
|
||||
}
|
||||
message[lg] = '\0';
|
||||
}
|
||||
|
||||
void recvudp(int sock, char* buffer, int buf_len, void* addr, unsigned int addr_len) {
|
||||
int lg_recv = recvfrom(sock, buffer, buf_len, 0, (struct sockaddr*) addr, &addr_len);
|
||||
if (lg_recv == -1) {
|
||||
perror("Message could not be recieved, Error: ");
|
||||
exit(1);
|
||||
} else if (lg_recv < buf_len) {
|
||||
fprintf(stderr, "Only %i from %i characters have been reviewed.", lg_recv, buf_len);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void afficher_message(char* message, int lg) {
|
||||
message[lg] = '\0';
|
||||
printf("message construit: %s", message);
|
||||
}
|
||||
|
||||
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 */
|
||||
char* hostname;
|
||||
int protocole = 0; /* 0=tcp, 1=udp */
|
||||
int sock;
|
||||
char* message;
|
||||
struct hostent *hp;
|
||||
struct sockaddr_in addr;
|
||||
while ((c = getopt(argc, argv, "hu:pn:s")) != -1) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
usage(argv[0]);
|
||||
return 0;
|
||||
case 'p':
|
||||
if (source == 1) {
|
||||
usage(argv[0]);
|
||||
/* printf("usage: cmd [-p|-s][-n ##]\n"); */
|
||||
exit(1);
|
||||
}
|
||||
source = 0;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
if (source == 0) {
|
||||
usage(argv[0]);
|
||||
/* printf("usage: cmd [-p|-s][-n ##]\n"); */
|
||||
exit(1) ;
|
||||
}
|
||||
source = 1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
nb_message = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
protocole = 1;
|
||||
printf("%s\n", optarg);
|
||||
hostname = optarg;
|
||||
/* hostname = malloc((strlen(optarg) + 1) * sizeof(char)); */
|
||||
/* strcpy(hostname, optarg); */
|
||||
break;
|
||||
|
||||
default:
|
||||
usage(argv[0]);
|
||||
/* printf("usage: cmd [-p|-s][-n ##]\n"); */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (source == -1) {
|
||||
usage(argv[0]);
|
||||
/* printf("usage: cmd [-p|-s][-n ##]\n"); */
|
||||
exit(1) ;
|
||||
}
|
||||
|
||||
if (source == 1)
|
||||
printf("on est dans le source\n");
|
||||
else
|
||||
printf("on est dans le puits\n");
|
||||
|
||||
if (nb_message != -1) {
|
||||
if (source == 1)
|
||||
printf("nb de tampons à envoyer : %d\n", nb_message);
|
||||
else
|
||||
printf("nb de tampons à recevoir : %d\n", nb_message);
|
||||
} else {
|
||||
if (source == 1) {
|
||||
nb_message = 10 ;
|
||||
printf("nb de tampons à envoyer = 10 par défaut\n");
|
||||
} else {
|
||||
// changed envoyer to recevoir
|
||||
printf("nb de tampons à recevoir = infini\n");
|
||||
}
|
||||
|
||||
}
|
||||
/* protocole = 0 (udp) 1(tcp) */
|
||||
if (!protocole) /* if (tcp activated) */ {
|
||||
printf("TCP not implemented\n");
|
||||
return 0;
|
||||
} else {
|
||||
printf("using udp\n");
|
||||
}
|
||||
/* if (protocole) /\* udp *\/ { */
|
||||
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
/* } else { */
|
||||
/* sock = socket(AF_INET, SOCK_STREAM, 0); */
|
||||
/* } */
|
||||
if (sock < 0) {
|
||||
perror("Error creating socket:");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("socket created\n");
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = DEFAULTPORT;
|
||||
printf("%s\n", hostname);
|
||||
hp = gethostbyname(hostname);
|
||||
if (hp == NULL) {
|
||||
printf("hosname not found\n");
|
||||
/* herror("Error: "); */
|
||||
exit(1);
|
||||
}
|
||||
printf("hostname found\n");
|
||||
|
||||
memcpy(&addr.sin_addr.s_addr, hp->h_addr, hp->h_length);
|
||||
|
||||
printf("address built\n");
|
||||
if (bind(sock, (struct sockaddr*) &addr, (sizeof(addr))) < 0 ) {
|
||||
perror("Error while binding socket: ");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("socket bound\n");
|
||||
|
||||
message = malloc((MSG_LENGTH + 1) * sizeof(char));
|
||||
if (source) {
|
||||
construire_message(message, 'a', MSG_LENGTH);
|
||||
for (int i = 0; i < nb_message; ++i) {
|
||||
int lg_sent = sendto(sock, message, MSG_LENGTH, 0, (struct sockaddr*) &addr, sizeof(addr));
|
||||
if (lg_sent == -1) {
|
||||
perror("Message could not be sent, Error: ");
|
||||
exit(1);
|
||||
} else if (lg_sent < MSG_LENGTH) {
|
||||
fprintf(stderr, "Only %i from %i characters have been sent.", lg_sent, MSG_LENGTH);
|
||||
exit(1);
|
||||
}
|
||||
printf("message sent: %s\n", message);
|
||||
}
|
||||
} else {
|
||||
printf("puit not implemented\n");
|
||||
}
|
||||
|
||||
|
||||
if (close(sock) < 0) {
|
||||
perror("Error closing socket:");
|
||||
exit(1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in a new issue