Browse Source

Fin du projet. Serveur Fonctionnel

BQUINTAN 4 years ago
parent
commit
4df267d543
12 changed files with 1493 additions and 1279 deletions
  1. 660
    71
      bal.h
  2. 2
    3
      makefile
  3. 122
    0
      readme.txt
  4. BIN
      tsock
  5. 451
    539
      tsock.h
  6. BIN
      tsock_p2
  7. 0
    240
      tsock_p2.c
  8. 0
    80
      tsock_v0.c
  9. 0
    157
      tsock_v1_1.c
  10. BIN
      tsock_v3
  11. 0
    189
      tsock_v3.c
  12. 258
    0
      tsock_vf.c

+ 660
- 71
bal.h View File

@@ -1,71 +1,660 @@
1
-//
2
-// Created by Béranger Quintana | 3AE E
3
-//
4
-
5
-#ifndef PROGC_BAL_H
6
-#define PROGC_BAL_H
7
-//---------------------------------------------------
8
-//---------------Structure Liste---------------------
9
-//---------------------------------------------------
10
-
11
-typedef struct BAL
12
-{
13
-    int num_bal ;
14
-    struct LETTRE* lfirst ;
15
-    struct LETTRE* lcurrent ;
16
-    struct LETTRE* llast ;
17
-    struct BAL* suiv ;
18
-}BAL;
19
-
20
-typedef struct LETTRE
21
-{
22
-    int  num;
23
-    char* message ;
24
-    struct LETTRE* suiv ;
25
-};
26
-
27
-typedef struct LISTE {
28
-    struct BAL * bal_premier ;
29
-    struct BAL * bal_dernier ;
30
-    struct BAL * bal_courant ;
31
-}LISTE_BAL;
32
-//---------------------------------------------------
33
-//              GESTION BAL
34
-
35
-LISTE_BAL* initialiser_bal(){
36
-
37
-    LISTE_BAL liste ;
38
-    liste = (LISTE_BAL)malloc(sizeof(struct LISTE));
39
-    liste->bal_premier = NULL;
40
-    liste->bal_dernier = NULL;
41
-    liste->bal_courant = NULL;
42
-    return liste ;
43
-}
44
-
45
-void ajouter_bal(int num, LISTE_BAL * liste){
46
-
47
-    BAL ma_bal = (BAL)malloc(sizeof(struct BAL));
48
-    ma_bal->num_bal = num ;
49
-    ma_bal->l_premier=NULL;
50
-    ma_bal->l_dernier=NULL;
51
-    ma_bal->l_courant=NULL;
52
-    ma_bal->bal_suiv = NULL;
53
-
54
-
55
-    if (liste == NULL)
56
-    {
57
-        liste->bal_premier = ma_bal ;
58
-        liste->bal_dernier = ma_bal ;
59
-    }
60
-    else {
61
-        liste->bal_dernier->bal_suiv = ma_bal ;
62
-        liste->bal_dernier = ma_bal ;
63
-    }
64
-    liste->bal_courant = ma_bal ;
65
-}
66
-
67
-
68
-LISTE_BAL*
69
-
70
-
71
-#endif //PROGC_BAL_H
1
+//--------------------------PROG C ET RESEAUX-----------------------
2
+//                          Nom :    Quintana
3
+//                          Prénom : Béranger
4
+//                             Grp : 3AE E
5
+//------------------------------------------------------------------
6
+
7
+#ifndef __tsock__
8
+//Variable qui donne la longueur max d'un message
9
+int maxsize=9999;
10
+//Définitions des types
11
+
12
+typedef struct BAL 
13
+{
14
+    int num ;
15
+    int nb;
16
+    struct LETTRE * l_first ;
17
+    struct LETTRE * l_last ;
18
+    struct LETTRE * l_current ;
19
+    struct BAL * suiv ;
20
+}BAL ;
21
+
22
+typedef struct LETTRE 
23
+{
24
+    int num ;
25
+    int lg;
26
+    char *message ;
27
+    struct LETTRE * suiv ;
28
+}LETTRE ;
29
+
30
+typedef struct LISTE_BAL
31
+{
32
+    struct BAL * first ;
33
+    struct BAL * last ;
34
+    struct BAL * current ;
35
+    int nb;
36
+}LISTE_BAL;
37
+
38
+//---------------------------------------------------
39
+//---------Déclaration des fonctions-----------------
40
+//---------------------------------------------------
41
+
42
+LISTE_BAL* init_BAL();
43
+void add_BAL(int num , LISTE_BAL* liste);
44
+BAL* find_BAL(LISTE_BAL*liste, int num);
45
+int find_BALR(LISTE_BAL*liste, int num);
46
+void add_LETTRE (int n, int lg, BAL* bal , char* mess);
47
+void printBAL(BAL* bal,int lg);
48
+void empty(BAL*bal);
49
+void EBAL(int port, char* dest, int nb_message, int lg_msg, int nBAL);
50
+void SBAL(int port, char* dest);
51
+void RBAL(int port, char* dest, int nBAL);
52
+
53
+//---------------------------------------------------
54
+//--------------------GESTION BAL--------------------
55
+//---------------------------------------------------
56
+
57
+LISTE_BAL* init_BAL()
58
+{
59
+    LISTE_BAL* liste =(LISTE_BAL*)malloc(sizeof(struct LISTE_BAL));
60
+    liste->first = NULL;
61
+    liste->last=NULL;
62
+    liste->current = NULL;
63
+    liste->nb=0;
64
+    return liste ;
65
+}
66
+
67
+//------------------------------------------------
68
+//----Afficher le contenu d'une Liste de BAL------
69
+//6-----------------------------------------------
70
+void printLISTE(struct LISTE_BAL* liste)
71
+{
72
+    printf("              __________________________________________\n");
73
+    printf("                Check général des BAL de notre liste :\n\n");
74
+    printf("                        %d BAL dans notre liste       \n\n",liste->nb);
75
+    liste->current=liste->first;
76
+    while (liste->current!=NULL)
77
+    {
78
+    printf("                        BAL n°%d : %d Lettres          \n",liste->current->num,liste->current->nb);
79
+        liste->current=liste->current->suiv;
80
+    }
81
+    printf("              __________________________________________\n\n");
82
+
83
+}
84
+
85
+//------------------------------------------------
86
+//--------Afficher le contenu d'une BAL-----------
87
+//------------------------------------------------
88
+void printBAL(BAL* bal,int lg)
89
+{
90
+    printf("Contenu de la BAL n°%d qui contient %d lettres \n",bal->num,bal->nb) ;
91
+    bal->l_current=bal->l_first;
92
+    printf("\n");
93
+    int n=1;
94
+    while(bal->l_current!=NULL)
95
+    {
96
+        printf("BAL n°%d | %d Lettres, lettre n°%d : [",bal->num,bal->nb,n);
97
+        afficher_message(bal->l_current->message,lg);
98
+        bal->l_current=bal->l_current->suiv;
99
+        n++;
100
+    }
101
+    printf("\n\n");
102
+
103
+}
104
+//------------------------------------------------
105
+//----------------Ajouter une BAL-----------------
106
+//------------------------------------------------
107
+
108
+void add_BAL(int n, LISTE_BAL * liste)
109
+{
110
+    BAL *nouv =malloc(sizeof(struct BAL));
111
+    nouv->num=n;
112
+    nouv->nb=0;
113
+    nouv->l_first=NULL;
114
+    nouv->l_last=NULL;
115
+    nouv->l_current=NULL;
116
+    nouv->suiv=NULL;
117
+
118
+    if (liste->first == NULL)
119
+    {
120
+        liste->first = nouv ;
121
+        liste->last = nouv ;
122
+    }
123
+    else
124
+    {
125
+        liste->last->suiv= nouv ;
126
+        liste->last=nouv ;
127
+    }
128
+    liste->nb++;
129
+}
130
+
131
+//------------------------------------------------
132
+//----Retourne une BAL en fonction de son num-----
133
+//6-----------------------------------------------
134
+
135
+BAL* find_BAL(LISTE_BAL*liste, int num)
136
+{
137
+    BAL* bal=malloc(sizeof(struct BAL));
138
+    liste->current=liste->first;
139
+    if (liste->first==NULL)
140
+    {
141
+        add_BAL(num,liste);
142
+        bal=liste->first;
143
+    }
144
+    else
145
+    {
146
+        liste->current=liste->first;
147
+
148
+        if (liste->first==liste->last)
149
+        {
150
+            if (liste->first->num==num)
151
+                bal=liste->current;
152
+            else
153
+            {
154
+                add_BAL(num,liste);
155
+                bal=liste->last;
156
+            }
157
+        }
158
+        else if (liste->first->num==num)
159
+            bal=liste->first;
160
+        else
161
+        {
162
+            int var=0;
163
+            while(var==0)
164
+            {
165
+                if (liste->current->suiv==NULL)
166
+                    var=-1;
167
+                else
168
+                {
169
+                    liste->current=liste->current->suiv;
170
+                    if (liste->current->num==num)
171
+                        var=1;
172
+                    if (liste->current==NULL)
173
+                        var=-1;
174
+                }
175
+
176
+            }
177
+            if (var==1)
178
+                bal=liste->current;
179
+            else
180
+            {
181
+                add_BAL(num,liste);
182
+                bal=liste->last;
183
+            }
184
+        }
185
+    }
186
+    return bal;
187
+}
188
+
189
+//--------------------------------------------------------------------------------------------
190
+//----------------------------------------findBALR--------------------------------------------
191
+//-------Retourne -1 si BAL inexistante ou BAL Vide, lg 1ère lettre si BAL existante----------
192
+//--------------------------------------------------------------------------------------------
193
+int find_BALR(LISTE_BAL*liste, int num)
194
+{
195
+    int ret;
196
+    if (liste->first==NULL)
197
+    {
198
+        ret=-1;
199
+    }
200
+    else
201
+    {
202
+        liste->current=liste->first;
203
+        if (liste->current==liste->last)
204
+        {
205
+            if (liste->current->num==num)
206
+            {
207
+                if (liste->current->l_first==NULL)
208
+                    ret=-1;
209
+                else
210
+                    ret=liste->current->l_first->lg;
211
+            }
212
+            else
213
+                ret=-1;
214
+        }
215
+        else if (liste->first->num==num)
216
+        {
217
+            if (liste->current->l_first==NULL)
218
+                ret=-1;
219
+
220
+            else
221
+                ret=liste->current->l_first->lg;
222
+        }
223
+        else
224
+        {
225
+            int var=0;
226
+            while(var==0)
227
+            {
228
+                if (liste->current->suiv==NULL)
229
+                    var=-1;
230
+                else
231
+                {
232
+                    liste->current=liste->current->suiv;
233
+                    if (liste->current->num==num)
234
+                        var=1;
235
+                    if (liste->current==NULL)
236
+                        var=-1;
237
+                }
238
+
239
+            }
240
+            if (var==1)
241
+            {
242
+                if (liste->current->l_first==NULL)
243
+                    ret=-1;
244
+                else
245
+                    ret=liste->current->l_first->lg;
246
+            }
247
+            else
248
+                ret=-1;
249
+        }
250
+
251
+    }
252
+    return ret;
253
+}
254
+
255
+//-----------------------------------------------------------------
256
+//----------------Ajouter une lettre en fin de BAL-----------------
257
+//-----------------------------------------------------------------
258
+
259
+void add_LETTRE (int n, int lg, BAL* bal , char* mess)
260
+{
261
+    bal->nb=(bal->nb)+1;
262
+	LETTRE* nouv;
263
+	nouv=(LETTRE*)malloc(sizeof(LETTRE));
264
+	nouv->num=n+1;
265
+	nouv->lg=lg;
266
+	nouv->suiv=NULL;
267
+
268
+	if (bal->l_first==NULL)
269
+	{
270
+        bal->l_first=nouv;
271
+        bal->l_last=nouv;
272
+        bal->l_current=nouv;
273
+    }
274
+
275
+	else
276
+    {
277
+	    bal->l_last->suiv=nouv;
278
+        bal->l_last=bal->l_last->suiv;
279
+    }
280
+
281
+    nouv->message=malloc(lg* sizeof(char));
282
+    for (int i=0 ; i<lg ; i++)
283
+        nouv->message[i] = mess[i];
284
+}
285
+
286
+//-------------------------------------------------------------------------------------
287
+//----------------Détruit une liste de BAL en fin d'utilisation de BAL-----------------
288
+//6------------------------------------------------------------------------------------
289
+
290
+void empty(BAL*bal)
291
+{
292
+    bal->l_current=bal->l_first;
293
+    while(bal->l_current!=NULL)
294
+    {
295
+        bal->l_current=bal->l_current->suiv;
296
+        free(bal->l_first);
297
+        bal->l_first=bal->l_current;
298
+        (bal->nb)--;
299
+    }
300
+}
301
+void EBAL(int port, char* dest, int nb_message, int lg_msg, int nBAL)
302
+{
303
+    //Déclarations
304
+    int sock;
305
+    struct sockaddr_in addr_distant ;
306
+    int lg_addr_distant=sizeof(addr_distant);
307
+    struct hostent *hp;
308
+    char motif;
309
+    char * message=malloc(lg_msg*sizeof(char));
310
+    int envoi=-1;
311
+    int lg_pdu=50;
312
+    int lg_recv;
313
+    char*pdu=malloc(lg_pdu*sizeof(char));
314
+
315
+//---------------------------------------
316
+//--------Etablissement connexion--------
317
+//---------------------------------------
318
+    printf("            SOURCE : Emission de lettres pour la BAL n°%d\n",nBAL);
319
+    printf("____________________________________________________________________\n\n");
320
+
321
+    sprintf(pdu,"0 %d %d %d",nBAL, nb_message,lg_msg);
322
+
323
+    //Création socket
324
+    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
325
+    {
326
+        printf("Erreur à l'ouverture du Socket Stream");
327
+        exit(1);
328
+    }
329
+    //Construction adresse socket distant
330
+    memset((char*)&addr_distant,0,sizeof(addr_distant));
331
+    addr_distant.sin_family=AF_INET;  //Internet
332
+    addr_distant.sin_port=port;       //Numéro de Port
333
+
334
+    //Affectation IP
335
+    if((hp=gethostbyname(dest))==NULL)
336
+    {
337
+        printf("Erreur de requête IP.\n");
338
+        exit(1);
339
+    }
340
+
341
+    memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr , hp->h_length);
342
+
343
+    //Demande de connexion
344
+
345
+    if (connect(sock,(struct sockaddr *)&addr_distant,sizeof(addr_distant))==-1)
346
+    {
347
+        printf("Erreur lors de la connexion, en attente de la tentative suivante \n");
348
+        exit(1);
349
+    }
350
+//-----------------------------------------
351
+//----------------Envoi PDU----------------
352
+//-----------------------------------------
353
+
354
+    if ((envoi=write(sock,pdu,lg_pdu))==-1)
355
+    {
356
+        printf("Echec de l'envoi du PDU Emetteur (fonction write en défaut)\n");
357
+        exit(1);
358
+    }
359
+    //-----------------------------------------
360
+//----------TRANSFERT DE DONNEES-----------
361
+//-----------------------------------------
362
+
363
+
364
+
365
+    for (int i=1; i<=nb_message;i++)
366
+    {
367
+        printf("SOURCE : lettre n°%d (%d) [", i,lg_msg);
368
+
369
+        //Création du message
370
+        construire_message2(message,motif,lg_msg,i);
371
+        printbuffer2(nBAL,message);
372
+        afficher_message(message,lg_msg);
373
+
374
+        //Envoi du message
375
+
376
+        if ((envoi=write(sock,message,(lg_msg)/*,0,(struct sockaddr*)&addr_distant,lg_addr_distant)*/))==-1)
377
+        {
378
+            printf("Echec de l'envoi du message (fonction write en défaut)\n");
379
+            exit(1);
380
+        }
381
+
382
+    }
383
+
384
+
385
+
386
+    //Fermeture connexion
387
+
388
+    if(shutdown(sock,2)==-1)
389
+    {
390
+        printf("Erreur à la fermeture de la connexion TCP \n");
391
+        exit(1);
392
+    }
393
+
394
+    //Fermeture Socket
395
+    if (close(sock)==-1)
396
+    {
397
+        printf("Echec de la fermeture du socket distant");
398
+        exit(1);
399
+    }
400
+
401
+    free(message);
402
+    free(pdu);
403
+    printf("Envoi effectué avec succès\n");
404
+}
405
+
406
+void SBAL(int port, char*dest)
407
+{
408
+    //Déclarations
409
+    int sock , sock2; //sock bis local orienté échanges
410
+    struct sockaddr* addr_distant;
411
+    struct sockaddr_in addr_local;
412
+    int lg_addr_distant=sizeof(addr_distant);
413
+    int lg_addr_local=sizeof(addr_local);
414
+    struct hostent *hp;
415
+    char motif;
416
+    char *message;
417
+    int lg_recv=-1;
418
+    int lg_sent=-1;
419
+    int lg_pdu=50;
420
+    int type=-1;
421
+    int nb;
422
+    int lg;
423
+    int n=1;
424
+    int nBAL;
425
+    BAL*bal=malloc(sizeof(struct BAL));
426
+    char *pdu;//=malloc(sizeof(char));
427
+    LISTE_BAL* liste;
428
+//----------------------------------
429
+//------------Connexion ------------
430
+//----------------------------------
431
+
432
+    //Création socket local
433
+    if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
434
+    {
435
+        printf("Echec de la création d'un socket local\n");
436
+        exit(1);
437
+    }
438
+    //Construction adresse socket local | Affectation port et domaine
439
+    memset((char*)&addr_local, 0 , sizeof(addr_local));
440
+    addr_local.sin_family=AF_INET;
441
+    addr_local.sin_addr.s_addr=INADDR_ANY;
442
+    addr_local.sin_port=port;
443
+
444
+    //Bind
445
+    if (bind(sock,(struct sockaddr *)&addr_local, lg_addr_local)==-1)
446
+    {
447
+        printf("Echec du bind.\n");
448
+        exit(1);
449
+    }
450
+    //Check connexions entrantes
451
+    if (listen(sock,100)<0)
452
+    {
453
+        printf("Trop de connexions en attentes, échec de la demande\n");
454
+        exit(1);
455
+    }
456
+    liste=init_BAL();
457
+    while (1)
458
+    {
459
+        if ((sock2=accept(sock,(struct sockaddr*)&addr_distant,&lg_addr_distant))==-1)
460
+        {
461
+            printf("Refus de connexion par le serveur\n");
462
+            exit(1);
463
+        }
464
+
465
+        pdu=malloc(50*sizeof(char));
466
+        if((lg_pdu=read(sock2,pdu, lg_pdu))<0)
467
+        {
468
+            printf("Echec de lecture du PDU entrant\n");
469
+            exit(1);
470
+        }
471
+        sscanf(pdu, "%d %d %d %d", &type, &nBAL, &nb, &lg);
472
+        //GESTION EMETTEUR
473
+        if (atoi(pdu)==0)
474
+        {
475
+            printf("        ||||||| Réception des lettres pour la BAL n°%d |||||\n\n",nBAL);
476
+            message=malloc(lg*sizeof(char));
477
+            int n=0;
478
+            sscanf(pdu, "%d %d %d %d", &type, &nBAL, &nb, &lg);
479
+            bal=find_BAL(liste,nBAL);
480
+
481
+            while (n!=nb)
482
+            {
483
+                message = malloc(lg* sizeof(char));
484
+                if ((lg_recv = read(sock2, message, lg)) == -1)
485
+                {
486
+                    printf("Erreur de lecture\n");
487
+                    exit(1);
488
+                }
489
+                if (lg_recv>0)
490
+                {
491
+                    add_LETTRE(n,lg, bal,message);
492
+                }
493
+                n++;
494
+            }
495
+
496
+            printBAL(bal,lg);
497
+        }
498
+        //GESTION RECEPTEUR
499
+        else if (atoi(pdu)==1)
500
+        {
501
+            sscanf(pdu, "%d %d", &type, &nBAL);
502
+            printf("        ||||||| Restitution des lettres de la BAL n°%d |||||||\n\n",nBAL);
503
+            lg=find_BALR(liste,nBAL);
504
+            if (lg==-1) // Gestion du cas ou la BAL est vide, on envoie un PDU qui sera analysé par le récepteur.
505
+            {
506
+                printf("        BAL inexistante, PDU=0 pour informer le récepteur\n\n");
507
+                sprintf(pdu,"%d %d",lg,nb);
508
+                //printf ("PDU à envoyer : %d\n",lg);
509
+                int lg_sent=-1;
510
+                nb=1;
511
+                if ((lg_sent=write(sock2,pdu,lg_pdu))==-1) /*,0,(struct sockaddr*)&addr_distant,lg_addr_distant)*/
512
+                {
513
+                    printf("Echec de l'envoi du PDU  (fonction write en défaut)\n");
514
+                    exit(1);
515
+                }
516
+            }
517
+            else
518
+            {
519
+                bal=find_BAL(liste,nBAL);
520
+                bal->l_current=bal->l_first;
521
+
522
+                while(bal->l_current!=NULL)
523
+                {
524
+                    lg=bal->l_current->lg;
525
+                    nb=bal->nb;
526
+                    sprintf(pdu,"%d %d",lg,nb);
527
+
528
+                    if ((lg_sent=write(sock2,pdu,lg_pdu))==-1) /*,0,(struct sockaddr*)&addr_distant,lg_addr_distant)*/
529
+                    {
530
+                        printf("Echec de l'envoi du PDU Emetteur (fonction write en défaut)\n");
531
+                        exit(1);
532
+                    }
533
+                    message=malloc(lg*sizeof(char));
534
+                    message=bal->l_current->message;
535
+
536
+                    if ((lg_sent=write(sock2,message,lg))==-1)
537
+                    {
538
+                        printf("Erreur lors de l'envoi du message n°%d\n",n);
539
+                        exit(1);
540
+                    }
541
+                    printf("BAL n°%d : Restitution de la lettre n°%d (%d) [",nBAL,n,lg);
542
+                    afficher_message(message,lg);
543
+                    bal->l_current=bal->l_current->suiv;
544
+                    n++;
545
+                }
546
+                empty(bal);
547
+                if ((shutdown(sock2 , 2))==-1)
548
+                {
549
+                    printf("Erreur à la fermeture de la connexion : shutdown\n");
550
+                    exit(1);
551
+                }
552
+            }
553
+        }
554
+        else
555
+        {
556
+            printf("PDU non reconnu, on quitte par sécurité\n");
557
+            exit(1);
558
+        }
559
+        printLISTE(liste);
560
+        free(pdu);
561
+        free(message);
562
+    }
563
+}
564
+void RBAL(int port, char* dest, int nBAL)
565
+{
566
+    //Déclarations
567
+    int sock;
568
+    struct sockaddr_in addr_distant;
569
+    int lg_addr_distant = sizeof(addr_distant);
570
+    struct hostent *hp;
571
+    char *message; //Penser au free en fin de programme pour libérer l'espace mémoire
572
+    int envoi = -1;
573
+    int lg_pdu=50;
574
+    int lg_recv=-1;
575
+    int lg;
576
+    int nb;
577
+    char *pdu = malloc(lg_pdu*sizeof(char));
578
+
579
+//---------------------------------------
580
+//--------Etablissement connexion--------
581
+//---------------------------------------
582
+
583
+    sprintf(pdu,"1 %d",nBAL);
584
+    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
585
+    {
586
+        printf("Erreur à l'ouverture du Socket Stream");
587
+        exit(1);
588
+    }
589
+
590
+    //Construction adresse socket distant
591
+    memset((char *) &addr_distant, 0, sizeof(addr_distant));
592
+    addr_distant.sin_family = AF_INET;  //Internet
593
+    addr_distant.sin_port = port;       //Numéro de Port
594
+
595
+    //Affectation IP
596
+    if ((hp = gethostbyname(dest)) == NULL) {
597
+        printf("Erreur de requête IP.\n");
598
+        exit(1);
599
+    }
600
+
601
+    memcpy((char *) &(addr_distant.sin_addr.s_addr), hp->h_addr, hp->h_length);
602
+
603
+    //Demande de connexion
604
+
605
+    if (connect(sock, (struct sockaddr *) &addr_distant, sizeof(addr_distant)) == -1) {
606
+        printf("Erreur lors de la connexion, en attente de la tentative suivante \n");
607
+        exit(1);
608
+    }
609
+
610
+//-----------------------------------------
611
+//----------------Envoi PDU----------------
612
+//-----------------------------------------
613
+
614
+    if ((envoi = write(sock, pdu, lg_pdu)) == -1) /*,0,(struct sockaddr*)&addr_distant,lg_addr_distant)*/
615
+    {
616
+        printf("Echec de l'envoi du PDU Emetteur (fonction write en défaut)\n");
617
+        exit(1);
618
+    }
619
+    char*lgmsg=malloc(maxsize* sizeof(char));
620
+    nb=10;
621
+    int n=1;
622
+    lg_recv=1;
623
+    printf("             PUITS : Réception du contenu de la BAL n°%d\n",nBAL);
624
+    printf("____________________________________________________________________\n\n");
625
+
626
+    while(n<=nb)
627
+    {
628
+        if ((lg_recv=read(sock,lgmsg,lg_pdu))==-1)
629
+        {
630
+            printf("Erreur à la réception du PDU de longueur de message\n");
631
+            exit(1);
632
+        }
633
+        sscanf(lgmsg,"%d %d", &lg , &nb);
634
+        if (lg==-1)
635
+        {
636
+            printf("       ATTENTION : Pas de courrier à récupérer dans la BAL n°%d\n\n",nBAL);
637
+            exit(0);
638
+        }
639
+
640
+        message=malloc(lg*sizeof(char));
641
+        if ((lg_recv=read(sock,message,lg))==-1)
642
+        {
643
+            printf("Erreur à la réception du message\n");
644
+            exit(1);
645
+        }
646
+        printf("PUITS : Réception de la lettre n°%d : [",n);
647
+        afficher_message(message,lg);
648
+        n++;
649
+    }
650
+
651
+    printf("Fermeture de la Connexion\n");
652
+    //Ciao le socket
653
+    if(close(sock)==-1)
654
+    {
655
+        printf("Impossible de fermer le socket");
656
+        exit(1);
657
+    }
658
+}
659
+
660
+#endif

+ 2
- 3
makefile View File

@@ -1,3 +1,2 @@
1
-tsock: tsock_p2.c  tsock.h
2
-	gcc tsock_p2.c -o tsock_p2 -g
3
-
1
+tsock: tsock_vf.c  tsock.h bal.h
2
+	gcc tsock_vf.c -o tsock -g

+ 122
- 0
readme.txt View File

@@ -0,0 +1,122 @@
1
+                    __________________________________________________________________________
2
+                    ||              Projet de Programmation C orientée réseaux              ||
3
+                    ||                                                                      ||
4
+                    ||              Prénom : Béranger                                       ||
5
+                    ||              Nom :    Quintana                                       ||
6
+                    ||              Groupe : 3AE E                                          ||
7
+                    ||______________________________________________________________________||
8
+
9
+Bonjour, bienvenue sur ce programme d'échanges basé sur les protocoles TCP et UDP.
10
+Avec ce programme vous pourrez utiliser ces protocoles sous différentes formes :
11
+
12
+                    -De manière classique, avec un puits (-p) qui reçoit les informations d'une source (-s)
13
+                    -Avec une nouvelle fonctionnalité de serveur de Boite aux Lettres
14
+
15
+La fonctionnalité qui sera lancée au démarrage du programme sera celle de BAL.
16
+
17
+________________________________________________________________________________________________________________________
18
+                                                    Lancement de tsock
19
+________________________________________________________________________________________________________________________
20
+
21
+Pour lancer le programme, ouvrez un terminal dans le répertoire de travail, puis tapez la commande :
22
+
23
+                                                           make
24
+
25
+Cela compilera vos fichiers. Vous pourrez par la suite lancer vos différents programmes.
26
+________________________________________________________________________________________________________________________
27
+                                               USAGE de la Boite Aux Lettres
28
+________________________________________________________________________________________________________________________
29
+                                                ==========================
30
+                                                LANCEMENT D'UN SERVEUR BAL
31
+                                                ==========================
32
+Ici on peut lancer un serveur de Boites aux lettres sur une adresse IP et un port donné. Ce serveur se comporte comme
33
+une boucle infinie qui stocke les messages entrants dans des Boites aux lettres et les délivre par la suite après
34
+requête d'un récepteur.
35
+
36
+Pour lancer notre serveur BAL, il faut utiliser l'option -b du programme et lui attribuer un port d'écoute
37
+    Exemple, je veux lancer un serveur BAL sur le port 9000 :
38
+        Commande à utiliser :
39
+                                                     ./tsock -b 9000
40
+
41
+                                                   ====================
42
+                                                   EMISSION DE MESSAGES
43
+                                                   ====================
44
+
45
+Pour envoyer une ou plusieurs lettres,  à un boite aux lettres, il faut utiliser l'option -e# du programme avec # le
46
+numéro de Boite aux lettres destinataire, ainsi que fournir l'adresse IP du serveur, et le port d'écoute.
47
+    Exemple je veux envoyer des messages à la BAL n°5 sur l'IP 127.0.0.1, sur le port 9000
48
+        Commande à utiliser :
49
+                                               ./tsock -e5 127.0.0.1 9000
50
+
51
+        NB : si vous ne précisez pas le numéro de BAL cela envoira par défaut sur la BAL n°0
52
+
53
+Options disponibles pour l'émetteur :
54
+    -n# : fixe le nombre de message à émettre avec # le nombre de messages
55
+    -l# : fixe la longueur des messages à émettre avec # la longueur des messages pour cet envoi.
56
+    ATTENTION : On ne peut pas envoyer de messages plus court que les messages présents dans la BAL sous peine de
57
+                rogner les messages ces derniers. Le programme ne vous en informera pas lors de l'envoi...
58
+                En revanche, on peut envoyer des messages plus long que ceux précédemment envoyés.
59
+
60
+                                                   =====================
61
+                                                   RECEPTION DE MESSAGES
62
+                                                   =====================
63
+
64
+Pour récupérer les lettres d'une boite aux lettres le principe est le même :
65
+    Exemple : Je veux récupérer les lettres de la BAL n°5, à l'IP 127.0.0.1, sur le port 9000 :
66
+        Commande à utiliser :
67
+                                                 ./tsock -r5 localhost 9000
68
+
69
+        Vous ne pouvez ici que récupérer l'ensemble des lettres disponibles dans une des Boites aux lettres.
70
+        Les options -n et -l ne sont donc pas utilisables.
71
+
72
+========================================================================================================================
73
+========================================================================================================================
74
+
75
+Avec ces fichiers vous pourrez également utiliser TCP et UDP dans des usages plus classiques d'envois et réceptions
76
+directes
77
+
78
+________________________________________________________________________________________________________________________
79
+                                                    USAGE CLASSIQUE
80
+________________________________________________________________________________________________________________________
81
+
82
+    -Il est nécessaire d'activer le puits en premier et en lui attribuant une adresse IP distante ainsi qu'un
83
+    numéro de port
84
+        Exemple : Je veux recevoir depuis l'hôte local sur le port 9000
85
+            Commande à utiliser :
86
+                                              ./tsock -p localhost 9000
87
+
88
+    Seulement après avoir activé notre puits, on peut lancer notre source toujours en lui attribuant l'IP destinataire
89
+    et le numéro de port ou l'on veut envoyer nos informations.
90
+        Exemple : Je veux envoyer à destination de l'hote local sur le port 9000
91
+            Commande à utiliser :
92
+                                              ./tsock -s localhost 9000
93
+
94
+Liste des options :
95
+
96
+        -n : permet de fixer le nombre de messages à envoyer (par défaut : 10)
97
+        -l : permet de fixer la longueur des messages à envoyer (par défaut 30)
98
+        -u : permet d'utiliser le protocole UDP car TCP est utilisé par défaut
99
+
100
+      Pour l'usage classique, il est important que l'utilisateur du puits, paramètre correctement la longueur des
101
+      messages à recevoir pour pouvoir les recevoir correctement, sinon, la longueur par défaut sera de 30 caractères.
102
+
103
+      De plus, concernant le nombre de messages, si l'utilisateur du puits utilise l'option -n, et que le n du puits
104
+      est inférieur au -n du récepteur, il ne recevra pas les denrniers messages.
105
+
106
+________________________________________________________________________________________________________________________
107
+                                                 Remarques Générales
108
+________________________________________________________________________________________________________________________
109
+
110
+        -En principe, l'utilisation de fonctions de la partie Classique sur une serveur BAL ne fonctionne pas.
111
+         Par exemple, l'envoi depuis une source TCP (-s) vers un serveur BAL (-b) en fonctionnement contenant déjà des
112
+         lettres, enverra les lettres sur la dernière BAL utilisée. L'envoi depuis une source vers un serveur BAL ne
113
+         contenant pas de lettres sera bloquant. Il faudra relancer le serveur BAL pour pouvoir recevoir des lettres.
114
+
115
+        -La problématique de la longueur des messages à recevoir côté serveur n'a pas pu être traitée par manque de
116
+         temps.
117
+
118
+        -Il reste surement des coquilles....
119
+
120
+Si besoin, n'hésitez pas à me contacter : bquintan@etud.insa-toulouse.fr
121
+
122
+Bonne correction!

BIN
tsock View File


+ 451
- 539
tsock.h View File

@@ -1,539 +1,451 @@
1
-//--------------------------PROG C ET RESEAUX-----------------------
2
-//Nom :    Quintana  -----------------------------------------------
3
-//Prénom : Béranger  -----------------------------------------------
4
-//Groupe : 3AE E     -----------------------------------------------
5
-//------------------------------------------------------------------
6
-
7
-#ifndef __tsock__
8
-
9
-//---------------------------------------------------
10
-//-------------Déclaration des fonctions-------------
11
-//---------------------------------------------------
12
-
13
-void construire_message(char *message, char motif, int lg, int i);
14
-void construire_message2(char *message, char motif, int lg, int i);
15
-void afficher_message(char *message, int lg);
16
-void envoi_UDP(int port, int nb_message  , int lg_msg, char*dest);
17
-void reception_UDP(int port, int nb_message , int lg_message);
18
-void ClientTCP (int port, int nb_message , int lg_msg, char* dest);
19
-void ServeurTCP(int port , int nb_message, int lg_msg);
20
-void printbuffer(int n);
21
-void printbuffer2(int n , char*message);
22
-
23
-
24
-
25
-
26
-//---------------------------------------------------
27
-//-------------Définitions des fonctions-------------
28
-//---------------------------------------------------
29
-
30
-//-------------Construire message 2 -----------------
31
-void construire_message2(char *message, char motif, int lg, int i)
32
-{
33
-
34
-    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
35
-    if (i>26)
36
-        motif=alphabet[i%26-1];
37
-    else if (i=26)
38
-    	motif='z';
39
-
40
-    else
41
-        motif = alphabet[i - 1];
42
-
43
-
44
-    for (int j=0;j<lg-5;j++)
45
-    {
46
-
47
-        *(message+j+5) = motif;
48
-    }
49
-}
50
-
51
-//------------------PRINTBUFFER-----------------------
52
-void printbuffer(int n)
53
-{
54
-    if (n<10)
55
-    {
56
-        printf("[----%d",n);
57
-    }
58
-    if (n>=10 & n<100)
59
-    {
60
-        printf("[---%d",n);
61
-    }
62
-    if (n>=100 & n<1000)
63
-    {
64
-        printf("[--%d",n);
65
-    }
66
-    if (n>=1000 & n<10000)
67
-    {
68
-        printf("[--%d",n);
69
-    }
70
-    if (n>=10000 & n<100000)
71
-    {
72
-        printf("[-%d",n);
73
-    }
74
-    if (n>=100000 & n<1000000)
75
-    {
76
-        printf("[%d",n);
77
-    }
78
-    if (n>=1000000)
79
-    {
80
-        printf("Trop de messages à envoyer (n>1000000 \n");
81
-        exit(1);
82
-    }
83
-}
84
-
85
-
86
-//------------------PRINTBUFFER2----------------------
87
-void printbuffer2(int n , char*message)
88
-{
89
-	if (n>=100000)
90
-    {
91
-        printf("Trop de messages à envoyer (n>1000000 \n");
92
-        exit(1);
93
-    }
94
-
95
-    if (n<10)
96
-    {
97
-        for (int i=0 ; i<4 ; i++)
98
-        {
99
-            *(message+i)='-';
100
-        }
101
-        //char nb[1];      
102
-        *(message+4)= n + '0';
103
-    }
104
-    if (n>=10 & n<100)
105
-    {
106
-    	char nb[2];
107
-
108
-        for (int i=0 ; i<3 ; i++)
109
-        {
110
-            *(message+i)='-';
111
-        }
112
-        sprintf(nb,"%d",n);
113
-        *(message+3)=*nb;
114
-        n=n%10;
115
-        sprintf(nb,"%d", n);
116
-        *(message+4)=*nb;
117
-    }
118
-    if (n>=100 & n<1000)
119
-    {
120
-        char nb[3];
121
-        for (int i=0 ; i<2 ; i++)
122
-        {
123
-            *(message+i)='-';
124
-        }
125
-        sprintf(nb,"%d",n);
126
-        *(message+2)=*nb;
127
-        n=n%100;
128
-        sprintf(nb,"%d", n);
129
-        *(message+3)=*nb;
130
-        n=n%10;
131
-        sprintf(nb,"%d", n);
132
-        *(message+4)=*nb;
133
-    }
134
-    if (n>=1000 & n<10000)
135
-    {
136
-    	int j=1000;
137
-
138
-        char nb[4];
139
-        for (int i=0 ; i<2 ; i++)
140
-        {
141
-            *(message+i)='-';
142
-        }
143
-
144
-        sprintf(nb,"%d",n);
145
-        *(message+1)=*nb;
146
-        n=n%1000;
147
-        sprintf(nb,"%d", n);
148
-        *(message+2)=*nb;
149
-        n=n%100;
150
-        sprintf(nb,"%d", n);
151
-        *(message+3)=*nb;
152
-        n=n%10;
153
-        sprintf(nb,"%d", n);
154
-        *(message+4)=*nb;
155
-    }
156
-    if (n>=10000 & n<100000)
157
-    {
158
-        char nb[4];
159
-        for (int i=0 ; i<2 ; i++)
160
-        {
161
-            *(message+i)='-';
162
-        }
163
-        sprintf(nb,"%d",n);
164
-        *(message)=*nb;
165
-        n=n%10000;
166
-        sprintf(nb,"%d", n);
167
-        *(message+1)=*nb;
168
-        n=n%1000;
169
-        sprintf(nb,"%d", n);
170
-        *(message+2)=*nb;
171
-        n=n%100;
172
-        sprintf(nb,"%d", n);
173
-        *(message+3)=*nb;
174
-        n=n%10;
175
-        sprintf(nb,"%d", n);
176
-        *(message+4)=*nb;
177
-    }
178
-    
179
-    
180
-}
181
-
182
-//Construction des messages
183
-
184
-void construire_message(char *message, char motif, int lg, int i )
185
-
186
-{
187
-	char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
188
-	if (i>26)
189
-	    motif=alphabet[i%26-1];
190
-
191
-	else
192
-	    motif = alphabet[i - 1];
193
-
194
-
195
-  	for (int j=0;j<lg-5;j++)
196
-    {
197
-    	
198
-    	*(message+j) = motif;
199
-    }
200
-}
201
-
202
-//---------------------------------------------------
203
-//-------------Affichage des messages----------------
204
-//---------------------------------------------------
205
-
206
-void afficher_message(char *message, int lg)
207
-
208
-{
209
-  	
210
-  	int i;
211
-
212
-  	for (i=0;i<lg;i++)
213
-    {
214
-      	printf("%c", *(message+i));
215
-    }
216
-  	printf("]\n");
217
-}
218
-
219
-
220
-//----------------------------------------------------
221
-//----------------Envoi UDP---------------------------
222
-//----------------------------------------------------
223
-
224
-void envoi_UDP(int port ,int nb_mess , int lg_msg,char*dest)
225
-
226
-  
227
-{
228
-	
229
-  	int length_addr_dist;
230
-  	length_addr_dist=sizeof(struct sockaddr_in);
231
- 	 
232
-  	int sock;
233
- 	int sent;
234
-  	struct sockaddr_in addr_distant;
235
-  	struct hostent* hp;
236
-  	char *message=malloc(sizeof(char)*lg_msg) ;
237
-
238
-   	if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur (socket retourne -1 si le socket ne s'ouvre pas comme il faut
239
-    {
240
-      printf("Erreur à la création du socket\n");
241
-      exit(1);
242
-    }
243
-  	memset((char*)&addr_distant,0,sizeof(addr_distant));
244
-  	addr_distant.sin_family=AF_INET;
245
-  	addr_distant.sin_port=port;
246
-
247
-  	if((hp=gethostbyname(dest))==NULL)
248
-    {
249
-      printf("Erreur gethostbyname\n");
250
-      exit(1);
251
-    }
252
-
253
-    //printf("Après gethostbyname , nb_message= %d\n",nb_mess);
254
-      
255
-  	memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr, hp->h_length);
256
-  	//printf("Association IP OK\n");
257
-  	//printf("Nombre de messages à envoyer : %d\n", nb_mess);
258
-      
259
-  	for (int i=1; i<=nb_mess ; i++)
260
-    {
261
-    	construire_message(message,'a',lg_msg,i);
262
-      	printf("SOURCE : Envoi n°%d (%d) [", i, lg_msg);
263
-      	
264
-
265
-      	if((sent=sendto(sock,message,lg_msg,0,(struct sockaddr*)&addr_distant,sizeof(addr_distant)))==-1)   
266
-      	{
267
-      		printf("Erreur sendto\n");
268
-      		exit(1);
269
-      	} 
270
-      	printbuffer2(i,message);
271
-      	afficher_message(message,sent);
272
-    }
273
-
274
-  	if(close(sock)==-1) //fermeture + test erreur à la fermeture
275
-    {
276
-      printf("Echec à la destruction du socket\n");
277
-      exit(1);
278
-    }
279
-}
280
-
281
-//----------------------------------------------------
282
-//------------------Reception UDP---------------------
283
-//----------------------------------------------------
284
-
285
-void reception_UDP(int port, int nb_message, int lg_message)
286
-{
287
-
288
-  int sock;
289
-  struct sockaddr_in addr_local,addr_distant;
290
-  int recv;
291
-  int lg_dist;
292
-  char *message=malloc(sizeof(char)*lg_message) ;
293
-
294
-  if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur d'ouverture
295
-    {
296
-      printf("Erreur à la création du socket\n");
297
-      exit(1);
298
-    }
299
-  
300
-  	memset((char*)&addr_local,0,sizeof(addr_local));//reset de addr_local
301
- 	addr_local.sin_family=AF_INET;                  //attribution des différents attributs de addr_local
302
-  	addr_local.sin_port=port;
303
-  	addr_local.sin_addr.s_addr=INADDR_ANY;          //On dit que l'on veut recevoir sur n'importe quelle carte réseau de notre machine (=INADDR_ANY)
304
-
305
-
306
-  	if ((bind(sock,(struct sockaddr*)&addr_local, sizeof(addr_local)))==-1) //bind de la réception + test erreur du bind
307
-    {
308
-      	printf("Echec du Bind\n");
309
-      	exit(1);
310
-    }
311
-
312
-    //printf("bind OK\n");
313
-     
314
-  	if (nb_message==-1)
315
-     	nb_message=10;
316
-
317
-    //printf("%d messages à recevoir\n",nb_message);
318
-  	lg_dist=sizeof(addr_distant);
319
-  	//printf("lg_dist initialisé\n");
320
-      
321
-  	for (int i=1 ; i<=nb_message ; i++)
322
-    {
323
-	  	
324
-	  	recv=recvfrom(sock,message,lg_message,0,(struct sockaddr*)&addr_distant,&lg_dist);
325
-  		if (recv==-1) //process de réception (recvfrom natif à l'API socket, + test erreur 
326
-		{
327
-		  printf("Erreur receive from\n");
328
-		  exit(1);
329
-		}
330
-    	else 
331
-		{
332
-	 		printf("PUITS : Réception n°%d (%d) :",i,lg_message);
333
-	  		afficher_message(message,recv);
334
-		}
335
-    }
336
-  
337
-   if(close(sock)==-1) //fermeture + test erreur à la fermeture
338
-    {
339
-      printf("Echec à la destruction du socket\n");
340
-      exit(1);
341
-    }
342
-}
343
-
344
-//---------------------------------------------------------------
345
-//----------------ClientTCP <=> source=1-------------------------
346
-//---------------------------------------------------------------
347
-
348
-void ClientTCP (int port, int nb_message , int lg_msg , char* dest)
349
-{
350
-	//Déclarations
351
-	int sock;
352
-	struct sockaddr_in addr_distant ;
353
-	int lg_addr_distant=sizeof(addr_distant);
354
-
355
-	struct hostent *hp;
356
-	char motif;
357
-	char * message=malloc(lg_msg*sizeof(char)); //Penser au free en fin de programme pour libérer l'espace mémoire
358
-	int envoi=-1;
359
-
360
-//---------------------------------------
361
-//--------Etablissement connexion--------
362
-//---------------------------------------
363
-
364
-	//Création socket 
365
-	if((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
366
-	{
367
-		printf("Erreur à l'ouverture du Socket Stream");
368
-		exit(1);
369
-	}
370
-	
371
-	//Construction adresse socket distant
372
-	memset((char*)&addr_distant,0,sizeof(addr_distant));
373
-	addr_distant.sin_family=AF_INET;  //Internet
374
-	addr_distant.sin_port=port;       //Numéro de Port
375
-
376
-	//Affectation IP
377
-	if((hp=gethostbyname(dest))==NULL)
378
-	{
379
-		printf("Erreur de requête IP.\n");
380
-		exit(1);
381
-	}
382
-
383
-	memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr , hp->h_length);
384
-
385
-	//Demande de connexion
386
-	
387
-	if (connect(sock,(struct sockaddr *)&addr_distant,sizeof(addr_distant))==-1)
388
-	{
389
-		printf("Erreur lors de la connexion, en attente de la tentative suivante \n");
390
-
391
-	}
392
-
393
-	//printf("Connexion Réussie !\n");
394
-
395
-//-----------------------------------------
396
-//----------TRANSFERT DE DONNEES-----------
397
-//-----------------------------------------
398
-
399
-	for (int i=1; i<=nb_message;i++)
400
-	{
401
-		printf("SOURCE : envoi n°%d (%d) [", i,lg_msg);
402
-		//Création du message 
403
-		
404
-		construire_message(message,motif,lg_msg,i);
405
-
406
-		printbuffer2(i,message);
407
-		afficher_message(message,lg_msg);
408
-
409
-		//Envoi du message 
410
-
411
-		if ((envoi=write(sock,message,lg_msg/*,0,(struct sockaddr*)&addr_distant,lg_addr_distant)*/))==-1)
412
-		{
413
-			printf("Echec de l'envoi du message (fonction write en défaut)\n");
414
-			exit(1);
415
-		}
416
-	}
417
-
418
-	//Fermeture connexion
419
-
420
-	if(shutdown(sock,2)==-1)
421
-	{
422
-		printf("Erreur à la fermeture de la connexion TCP \n");
423
-		exit(1);
424
-	}
425
-
426
-	if (close(sock)==-1)
427
-	{
428
-		printf("Echec de la fermeture du socket distant");
429
-		exit(1);
430
-	}
431
-
432
-	free(message);
433
-
434
-	printf("Envoi effectué avec succès\n");
435
-}
436
-
437
-//---------------------------------------------------------------
438
-//----------------ServeurTCP <=> source=0-------------------------
439
-//---------------------------------------------------------------
440
-
441
-void ServeurTCP(int port , int nb_message, int lg_msg)
442
-{
443
-	//Déclarations
444
-	int sock , sock2; //sock bis local orienté échanges 
445
-	struct sockaddr* addr_distant;
446
-	struct sockaddr_in addr_local;
447
-	int lg_addr_distant=sizeof(addr_distant);
448
-	int lg_addr_local=sizeof(addr_local);
449
-	struct hostent *hp;
450
-	char motif;
451
-	char * message=malloc(lg_msg*sizeof(char)); //Penser au free en fin de programme pour libérer l'espace mémoire
452
-	int lg_recv=-1;
453
-
454
-//-------------
455
-//Connexion ---
456
-//-------------
457
-
458
-	//Création socket local 	
459
-
460
-	if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
461
-	{
462
-		printf("Echec de la création d'un socket local\n");
463
-		exit(1);
464
-	}
465
-
466
-	//Construction adresse socket local | Affectation port et domaine
467
-
468
-	memset((char*)&addr_local, 0 , sizeof(addr_local));
469
-	addr_local.sin_family=AF_INET;
470
-	addr_local.sin_addr.s_addr=INADDR_ANY;
471
-	addr_local.sin_port=port;
472
-
473
-	//printf("Socket créé addressé\n");
474
-
475
-	//Bind
476
-
477
-	if (bind(sock,(struct sockaddr *)&addr_local, lg_addr_local)==-1)
478
-	{
479
-		printf("Echec du bind.\n");
480
-		exit(1);
481
-	}
482
-	//printf("bind effectué\n");
483
-
484
-	//Check connexions entrantes 
485
-
486
-	if (listen(sock,100)<0)	
487
-	{
488
-		printf("Trop de connexions en attentes, échec de la demande\n");
489
-		exit(1);
490
-	}
491
-
492
-	//rintf("listen accepté\n");
493
-
494
-
495
-	//Accept connexion
496
-	
497
-
498
-	if (nb_message==-1)
499
-	{
500
-		nb_message=10;
501
-	}
502
-	if ((sock2 = accept(sock,(struct sockaddr*)&addr_distant,&lg_addr_distant))==-1)
503
-	{
504
-		printf("Refus de connexion par le serveur\n");
505
-		exit(1);
506
-	}
507
-	//printf("Accept validé, %d messages à recevoir\n",nb_message);
508
-	//Reception des messages au niveau du socket d'échange
509
-
510
-	for (int i=1;i<=nb_message;i++)
511
-	{
512
-		printf("PUITS : Réception n°%d (%d) [" , i , lg_msg);
513
-		if((lg_recv=read(sock2,message, lg_msg))<0)
514
-		{
515
-			printf("Echec de la lecture du message entrant \n");
516
-			exit(1);
517
-		}
518
-		afficher_message(message, lg_recv);
519
-	}
520
-	//Fermeture connexion
521
-
522
-	if ((shutdown(sock , 2))==-1)
523
-	{
524
-		printf("Erreur à la fermeture de la connexion : shutdown\n");
525
-		exit(1);
526
-	}
527
-		
528
-	//Ciao le socket
529
-	if(close(sock)==-1)
530
-	{
531
-		printf("Impossible de fermer le socket");
532
-	}
533
-
534
-	free(message);
535
-
536
-
537
-}
538
-
539
-#endif
1
+//--------------------------PROG C ET RESEAUX-----------------------
2
+//                          Nom :    Quintana
3
+//                          Prénom : Béranger
4
+//                             Grp : 3AE E
5
+//------------------------------------------------------------------
6
+#ifndef __tsock__
7
+//---------------------------------------------------
8
+//-------------Déclaration des fonctions-------------
9
+//---------------------------------------------------
10
+
11
+void construire_message2(char *message, char motif, int lg, int i);
12
+void afficher_message(char *message, int lg);
13
+void envoi_UDP(int port, int nb_message  , int lg_msg, char*dest);
14
+void reception_UDP(int port, int nb_message , int lg_message);
15
+void ClientTCP (int port, int nb_message , int lg_msg, char* dest);
16
+void ServeurTCP(int port , int nb_message, int lg_msg);
17
+void printbuffer(int n);
18
+void printbuffer2(int n , char*message);
19
+//---------------------------------------------------
20
+//---------------------------------------------------
21
+//-------------Définitions des fonctions-------------
22
+//---------------------------------------------------
23
+//---------------------------------------------------
24
+
25
+//---------------------------------------------------
26
+//-------------Construire message 2 ----------------- : Construit notre message à partir de l'alphabet
27
+//---------------------------------------------------
28
+void construire_message2(char *message, char motif, int lg, int i)
29
+{
30
+    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
31
+    if (i>=27)
32
+    {
33
+        if (i%26==0)
34
+            motif = 'z';
35
+        else
36
+            motif = alphabet[i%26-1];
37
+    }
38
+
39
+    else
40
+        motif=alphabet[i - 1];
41
+
42
+    for (int j=0;j<lg-5;j++)
43
+    {
44
+        *(message+j+5) = motif;
45
+    }
46
+}
47
+
48
+
49
+//----------------------------------------------------
50
+//------------------PRINTBUFFER2---------------------- : Modifie la variable message pour écrire le buffer ----# avec # le numéro d'envoi
51
+//----------------------------------------------------
52
+void printbuffer2(int n , char*message)
53
+{
54
+	if (n>=100000)
55
+    {
56
+        printf("Trop de messages à envoyer (n>1000000 \n");
57
+        exit(1);
58
+    }
59
+
60
+    if (n<10)
61
+    {
62
+        for (int i=0 ; i<4 ; i++)
63
+        {
64
+            *(message+i)='-';
65
+        }
66
+        //char nb[1];      
67
+        *(message+4)= n + '0';
68
+    }
69
+    if (n>=10 & n<100)
70
+    {
71
+    	char nb[2];
72
+
73
+        for (int i=0 ; i<3 ; i++)
74
+        {
75
+            *(message+i)='-';
76
+        }
77
+        sprintf(nb,"%d",n);
78
+        *(message+3)=*nb;
79
+        n=n%10;
80
+        sprintf(nb,"%d", n);
81
+        *(message+4)=*nb;
82
+    }
83
+    if (n>=100 & n<1000)
84
+    {
85
+        char nb[3];
86
+        for (int i=0 ; i<2 ; i++)
87
+        {
88
+            *(message+i)='-';
89
+        }
90
+        sprintf(nb,"%d",n);
91
+        *(message+2)=*nb;
92
+        n=n%100;
93
+        sprintf(nb,"%d", n);
94
+        *(message+3)=*nb;
95
+        n=n%10;
96
+        sprintf(nb,"%d", n);
97
+        *(message+4)=*nb;
98
+    }
99
+    if (n>=1000 & n<10000)
100
+    {
101
+    	int j=1000;
102
+
103
+        char nb[4];
104
+        for (int i=0 ; i<2 ; i++)
105
+        {
106
+            *(message+i)='-';
107
+        }
108
+
109
+        sprintf(nb,"%d",n);
110
+        *(message+1)=*nb;
111
+        n=n%1000;
112
+        sprintf(nb,"%d", n);
113
+        *(message+2)=*nb;
114
+        n=n%100;
115
+        sprintf(nb,"%d", n);
116
+        *(message+3)=*nb;
117
+        n=n%10;
118
+        sprintf(nb,"%d", n);
119
+        *(message+4)=*nb;
120
+    }
121
+    if (n>=10000 & n<100000)
122
+    {
123
+        char nb[4];
124
+        for (int i=0 ; i<2 ; i++)
125
+        {
126
+            *(message+i)='-';
127
+        }
128
+        sprintf(nb,"%d",n);
129
+        *(message)=*nb;
130
+        n=n%10000;
131
+        sprintf(nb,"%d", n);
132
+        *(message+1)=*nb;
133
+        n=n%1000;
134
+        sprintf(nb,"%d", n);
135
+        *(message+2)=*nb;
136
+        n=n%100;
137
+        sprintf(nb,"%d", n);
138
+        *(message+3)=*nb;
139
+        n=n%10;
140
+        sprintf(nb,"%d", n);
141
+        *(message+4)=*nb;
142
+    }
143
+}
144
+
145
+//----------------------------------------------------
146
+//-------------Affichage des messages-----------------
147
+//----------------------------------------------------
148
+void afficher_message(char *message, int lg)
149
+
150
+{
151
+  	for (int i=0;i<lg;i++)
152
+  	    printf("%c", *(message+i));
153
+  	printf("]\n");
154
+}
155
+
156
+//----------------------------------------------------
157
+//--------------------Envoi UDP-----------------------
158
+//----------------------------------------------------
159
+
160
+void envoi_UDP(int port ,int nb_mess , int lg_msg,char*dest)
161
+{
162
+	
163
+  	int length_addr_dist;
164
+  	length_addr_dist=sizeof(struct sockaddr_in);
165
+ 	 
166
+  	int sock;
167
+ 	int sent;
168
+  	struct sockaddr_in addr_distant;
169
+  	struct hostent* hp;
170
+  	char *message=malloc(sizeof(char)*lg_msg) ;
171
+
172
+   	if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur (socket retourne -1 si le socket ne s'ouvre pas comme il faut
173
+    {
174
+      printf("Erreur à la création du socket\n");
175
+      exit(1);
176
+    }
177
+  	memset((char*)&addr_distant,0,sizeof(addr_distant));
178
+  	addr_distant.sin_family=AF_INET;
179
+  	addr_distant.sin_port=port;
180
+
181
+  	if((hp=gethostbyname(dest))==NULL)
182
+    {
183
+      printf("Erreur gethostbyname\n");
184
+      exit(1);
185
+    }
186
+
187
+  	memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr, hp->h_length);
188
+
189
+  	for (int i=1; i<=nb_mess ; i++)
190
+    {
191
+        printbuffer2(i,message);
192
+    	construire_message2(message,'a',lg_msg,i);
193
+      	printf("SOURCE : Envoi n°%d (%d) : [", i, lg_msg);
194
+      	
195
+
196
+      	if((sent=sendto(sock,message,lg_msg,0,(struct sockaddr*)&addr_distant,sizeof(addr_distant)))==-1)   
197
+      	{
198
+      		printf("Erreur sendto\n");
199
+      		exit(1);
200
+      	}
201
+      	afficher_message(message,sent);
202
+    }
203
+
204
+  	if(close(sock)==-1) //fermeture + test erreur à la fermeture
205
+    {
206
+      printf("Echec à la destruction du socket\n");
207
+      exit(1);
208
+    }
209
+}
210
+
211
+//----------------------------------------------------
212
+//------------------Reception UDP---------------------
213
+//----------------------------------------------------
214
+
215
+void reception_UDP(int port, int nb_message, int lg_message)
216
+{
217
+
218
+  int sock;
219
+  struct sockaddr_in addr_local,addr_distant;
220
+  int recv;
221
+  int lg_dist;
222
+  char *message=malloc(sizeof(char)*lg_message) ;
223
+
224
+  if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur d'ouverture
225
+    {
226
+      printf("Erreur à la création du socket\n");
227
+      exit(1);
228
+    }
229
+  
230
+  	memset((char*)&addr_local,0,sizeof(addr_local));//reset de addr_local
231
+ 	addr_local.sin_family=AF_INET;                  //attribution des différents attributs de addr_local
232
+  	addr_local.sin_port=port;
233
+  	addr_local.sin_addr.s_addr=INADDR_ANY;          //On dit que l'on veut recevoir sur n'importe quelle carte réseau de notre machine (=INADDR_ANY)
234
+
235
+
236
+  	if ((bind(sock,(struct sockaddr*)&addr_local, sizeof(addr_local)))==-1) //bind de la réception + test erreur du bind
237
+    {
238
+      	printf("Echec du Bind\n");
239
+      	exit(1);
240
+    }
241
+
242
+
243
+  	lg_dist=sizeof(addr_distant);
244
+
245
+    int i=1;
246
+    while(recv!=0)
247
+    {
248
+        recv=recvfrom(sock,message,lg_message,0,(struct sockaddr*)&addr_distant,&lg_dist);
249
+        if (recv==-1) //process de réception (recvfrom natif à l'API socket, + test erreur
250
+        {
251
+            printf("Erreur receive from\n");
252
+            exit(1);
253
+        }
254
+
255
+        if (recv!=0)
256
+        {
257
+            printf("PUITS : Réception n°%d (%d) : [",i,lg_message);
258
+            afficher_message(message,recv);
259
+        }
260
+        if (i==nb_message)
261
+        {
262
+            recv=0;
263
+            printf("On a atteint le nombre de messages à recevoir\n");
264
+        }
265
+
266
+        i++;
267
+    }
268
+  
269
+   if(close(sock)==-1) //fermeture + test erreur à la fermeture
270
+    {
271
+      printf("Echec à la destruction du socket\n");
272
+      exit(1);
273
+    }
274
+}
275
+
276
+//----------------------------------------------------
277
+// ----------------ClientTCP <=> source=1-------------
278
+//----------------------------------------------------
279
+void ClientTCP (int port, int nb_message , int lg_msg , char* dest)
280
+{
281
+	//Déclarations
282
+	int sock;
283
+	struct sockaddr_in addr_distant ;
284
+	int lg_addr_distant=sizeof(addr_distant);
285
+
286
+	struct hostent *hp;
287
+	char motif;
288
+	char * message=malloc(lg_msg*sizeof(char));
289
+	int envoi=-1;
290
+
291
+//--------Etablissement connexion--------
292
+
293
+	//Création socket 
294
+	if((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
295
+	{
296
+		printf("Erreur à l'ouverture du Socket Stream");
297
+		exit(1);
298
+	}
299
+	
300
+	//Construction adresse socket distant
301
+	memset((char*)&addr_distant,0,sizeof(addr_distant));
302
+	addr_distant.sin_family=AF_INET;  //Internet
303
+	addr_distant.sin_port=port;       //Numéro de Port
304
+
305
+	//Affectation IP
306
+	if((hp=gethostbyname(dest))==NULL)
307
+	{
308
+		printf("Erreur de requête IP.\n");
309
+		exit(1);
310
+	}
311
+
312
+	memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr , hp->h_length);
313
+
314
+	//Demande de connexion
315
+	
316
+	if (connect(sock,(struct sockaddr *)&addr_distant,sizeof(addr_distant))==-1)
317
+	{
318
+		printf("Erreur lors de la connexion, en attente de la tentative suivante \n");
319
+        exit(1);
320
+	}
321
+
322
+	//Connexion Réussie !
323
+
324
+//----------TRANSFERT DE DONNEES-----------
325
+
326
+	for (int i=1; i<=nb_message;i++)
327
+	{
328
+		printf("SOURCE : envoi n°%d (%d) [", i,lg_msg);
329
+		//Création du message 
330
+		
331
+		construire_message2(message,motif,lg_msg,i);
332
+
333
+		printbuffer2(i,message);
334
+		afficher_message(message,lg_msg);
335
+
336
+		//Envoi du message 
337
+
338
+		if ((envoi=write(sock,message,lg_msg/*,0,(struct sockaddr*)&addr_distant,lg_addr_distant)*/))==-1)
339
+		{
340
+			printf("Echec de l'envoi du message (fonction write en défaut)\n");
341
+			exit(1);
342
+		}
343
+	}
344
+
345
+	//Fermeture connexion
346
+
347
+	if(shutdown(sock,2)==-1)
348
+	{
349
+		printf("Erreur à la fermeture de la connexion TCP \n");
350
+		exit(1);
351
+	}
352
+
353
+	if (close(sock)==-1)
354
+	{
355
+		printf("Echec de la fermeture du socket distant");
356
+		exit(1);
357
+	}
358
+
359
+	free(message);
360
+	printf("Envoi effectué avec succès\n");
361
+}
362
+//------------------------------------------------------------
363
+//----------------ServeurTCP <=> source=0---------------------
364
+//------------------------------------------------------------
365
+
366
+void ServeurTCP(int port , int nb_message, int lg_msg)
367
+{
368
+	//Déclarations
369
+	int sock , sock2; //sock bis local orienté échanges 
370
+	struct sockaddr* addr_distant;
371
+	struct sockaddr_in addr_local;
372
+	int lg_addr_distant=sizeof(addr_distant);
373
+	int lg_addr_local=sizeof(addr_local);
374
+	struct hostent *hp;
375
+	char motif;
376
+	char * message=malloc(lg_msg*sizeof(char)); //Penser au free en fin de programme pour libérer l'espace mémoire
377
+	int lg_recv=-1;
378
+
379
+//-----------------Connexion --------------
380
+
381
+	//Création socket local 	
382
+
383
+	if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
384
+	{
385
+		printf("Echec de la création d'un socket local\n");
386
+		exit(1);
387
+	}
388
+
389
+	//Construction adresse socket local | Affectation port et domaine
390
+
391
+	memset((char*)&addr_local, 0 , sizeof(addr_local));
392
+	addr_local.sin_family=AF_INET;
393
+	addr_local.sin_addr.s_addr=INADDR_ANY;
394
+	addr_local.sin_port=port;
395
+	//Bind
396
+
397
+	if (bind(sock,(struct sockaddr *)&addr_local, lg_addr_local)==-1)
398
+	{
399
+		printf("Echec du bind.\n");
400
+		exit(1);
401
+	}
402
+
403
+	//Check connexions entrantes 
404
+
405
+	if (listen(sock,100)<0)	
406
+	{
407
+		printf("Trop de connexions en attentes, échec de la demande\n");
408
+		exit(1);
409
+	}
410
+
411
+	//Accept connexion
412
+
413
+	if (nb_message==-1)
414
+		nb_message=10;
415
+
416
+	if ((sock2 = accept(sock,(struct sockaddr*)&addr_distant,&lg_addr_distant))==-1)
417
+	{
418
+		printf("Refus de connexion par le serveur\n");
419
+		exit(1);
420
+	}
421
+
422
+	//Reception des messages au niveau du socket d'échange
423
+
424
+//--------------Reception des données-----------
425
+    int i=1;
426
+    while(lg_recv!=0)
427
+    {
428
+
429
+        if((lg_recv=read(sock2,message, lg_msg))<0)
430
+        {
431
+            printf("Echec de la lecture du message entrant \n");
432
+            exit(1);
433
+        }
434
+        if (lg_recv!=0)
435
+        {
436
+            printf("PUITS : Réception n°%d (%d) [" , i , lg_msg);
437
+            afficher_message(message, lg_recv);
438
+            i++;
439
+        }
440
+    }
441
+
442
+	//Ciao le socket
443
+	if(close(sock)==-1)
444
+	{
445
+		printf("Impossible de fermer le socket");
446
+		exit(1);
447
+	}
448
+	free(message);
449
+}
450
+
451
+#endif

BIN
tsock_p2 View File


+ 0
- 240
tsock_p2.c View File

@@ -1,240 +0,0 @@
1
-//--------------------------PROG C ET RESEAUX-----------------------
2
-//Nom :    Quintana  -----------------------------------------------
3
-//Prénom : Béranger  -----------------------------------------------
4
-//Groupe : 3AE E     -----------------------------------------------
5
-//------------------------------------------------------------------
6
-
7
-
8
-/* librairie standard ... */
9
-#include <stdlib.h>
10
-/* pour getopt */
11
-#include <unistd.h>
12
-/* déclaration des types de base */
13
-#include <sys/types.h>
14
-/* constantes relatives aux domaines, types et protocoles */
15
-#include <sys/socket.h>
16
-/* constantes et structures propres au domaine UNIX */
17
-#include <sys/un.h>
18
-/* constantes et structures propres au domaine INTERNET */
19
-#include <netinet/in.h>
20
-/* structures retournées par les fonctions de gestion de la base de
21
-données du réseau */
22
-#include <netdb.h>
23
-/* pour les entrées/sorties */
24
-#include <stdio.h>
25
-/* pour la gestion des erreurs */
26
-#include <errno.h>
27
-/* fonctions de tsock*/
28
-#include "tsock.h"
29
-/*fonctions de BAL*/
30
-#include "bal.h"
31
-/* pour afficher l'adresse d'un socket */
32
-#include <arpa/inet.h>
33
-
34
-
35
-/**********************************************************************
36
-Programme Principal
37
-**********************************************************************/
38
-
39
-void main (int argc, char **argv)
40
-{
41
-
42
-    //Déclarations
43
-
44
-    int c;
45
-    extern char *optarg;
46
-    extern int optind;
47
-    int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
48
-    int source = -1 ; /* 0=puits, 1=source */
49
-    int tcp=1; //tcp=1 => tcp ; tcp=0 =>udp
50
-    struct hostent *hp;
51
-    int bal=-1;
52
-    int port = -1; //Numéro de port
53
-    int recep=-1;
54
-    port =htons(port);
55
-
56
-    char *dest ;
57
-    int lg =30;
58
-
59
-    while ((c = getopt(argc, argv, "pn:sul:be:r:")) != -1)
60
-    {
61
-
62
-        switch (c)
63
-        {
64
-            case 'p':
65
-                if (source == 1)
66
-                {
67
-                    printf("usage: cmd [-p|-s][-n ##]\n");
68
-                    exit(1);
69
-                }
70
-                source = 0;
71
-                break;
72
-
73
-            case 's':
74
-                if (source == 0)
75
-                {
76
-                    printf("usage: cmd [-p|-s][-n ##]\n");
77
-                    exit(1) ;
78
-                }
79
-                dest=argv[argc-2];
80
-                source = 1;
81
-                break;
82
-
83
-            case 'n':
84
-                nb_message = atoi(optarg);
85
-                if (nb_message>100000)
86
-                {
87
-                    printf("Trop d'envois, n> 100 000\n");
88
-                    exit (1);
89
-                }
90
-                break;
91
-
92
-            case 'u':
93
-                tcp=0;
94
-                break;
95
-
96
-            case 'l':
97
-                lg = atoi(optarg);
98
-                break;
99
-
100
-            case 'b' :
101
-                bal=1;
102
-                break;
103
-
104
-            case 'e' :
105
-                if (recep==1)
106
-                {
107
-                    printf("On ne peut pas être émetteur et récepteur, -r ou -e, pas les deux\n");
108
-                    exit(1);
109
-                }
110
-
111
-                bal=1;
112
-                recep=0;
113
-
114
-                break;
115
-
116
-            case 'r' :
117
-                if (recep==0)
118
-                {
119
-                    printf("On ne peut être émetteur et récepteur en même temps : -e ou -r mais pas les deux\n");
120
-                    exit(1);
121
-                }
122
-                bal=1;
123
-                recep=1;
124
-
125
-
126
-                break;
127
-
128
-
129
-            default:
130
-                printf("usage: cmd [-p|-s|-b|-e|-r][-n ##]\n");
131
-                break;
132
-        }
133
-    }
134
-
135
-    if ((port=atoi(argv[argc-1]))!=-1)
136
-    {
137
-        port=htons(port);
138
-    }
139
-    dest=argv[argc-2];
140
-
141
-    if (source == -1 & bal ==-1)
142
-    {
143
-        printf("usage: cmd [-p|-s][-n ##]\n");
144
-        exit(1) ;
145
-    }
146
-    if (bal == -1)
147
-    {
148
-        if (source == 1)
149
-            printf("SOURCE : ");
150
-        else
151
-            printf("PUITS : ");
152
-
153
-
154
-        if (tcp==1)
155
-            printf("Protocole de transport : TCP | ");
156
-
157
-        else
158
-            printf("Protocole de transport : UDP | ");
159
-
160
-        if (nb_message == -1)
161
-        {
162
-
163
-            if (source == 1)
164
-            {
165
-                nb_message = 10;
166
-                printf("Nombre d'envois : %d | ", nb_message);
167
-            }
168
-            else
169
-                printf("Nombre de receptions : infini | ");
170
-        }
171
-
172
-        else
173
-        {
174
-            if (source == 1)
175
-            {
176
-
177
-                printf("Nombre d'envois = %d | ", nb_message);
178
-            }
179
-            else
180
-            {
181
-                printf("nb de tampons à recevoir = %d | ",nb_message);
182
-            }
183
-        }
184
-
185
-        printf("Destinataire : %s\n", dest);
186
-
187
-
188
-        //Envoi de message, Source en UDP
189
-
190
-        int length_addr_dist;
191
-        length_addr_dist=sizeof(struct sockaddr_in);
192
-
193
-
194
-        if(source==1 & tcp==0)
195
-        {
196
-            envoi_UDP(port,nb_message,lg,dest);
197
-        }
198
-
199
-            //PUITS de réception en UDP
200
-
201
-        else if (source==0 & tcp==0)
202
-        {
203
-            reception_UDP(port,nb_message,lg);
204
-        }
205
-
206
-
207
-        else if (source==0 & tcp==1)
208
-        {
209
-
210
-            ServeurTCP(port, nb_message, lg);
211
-        }
212
-
213
-        else if (source==1 & tcp==1)
214
-        {
215
-
216
-            ClientTCP(port,nb_message,lg,dest);
217
-        }
218
-    }
219
-
220
-    else
221
-    {
222
-        if (bal==1 &recep==0)
223
-        {
224
-            printf("On fait un serveur BAL\n");
225
-        }
226
-
227
-        else if (bal==1 & recep ==0)
228
-        {
229
-            printf("On est emetteur de lettres\n");
230
-        }
231
-
232
-        else if(bal==1 &recep == 1)
233
-        {
234
-            printf("On récupère des lettres \n");
235
-        }
236
-    }
237
-
238
-
239
-    exit(0);
240
-}

+ 0
- 80
tsock_v0.c View File

@@ -1,80 +0,0 @@
1
-/* librairie standard ... */
2
-#include <stdlib.h>
3
-/* pour getopt */
4
-#include <unistd.h>
5
-/* déclaration des types de base */
6
-#include <sys/types.h>
7
-/* constantes relatives aux domaines, types et protocoles */
8
-#include <sys/socket.h>
9
-/* constantes et structures propres au domaine UNIX */
10
-#include <sys/un.h>
11
-/* constantes et structures propres au domaine INTERNET */
12
-#include <netinet/in.h>
13
-/* structures retournées par les fonctions de gestion de la base de
14
-données du réseau */
15
-#include <netdb.h>
16
-/* pour les entrées/sorties */
17
-#include <stdio.h>
18
-/* pour la gestion des erreurs */
19
-#include <errno.h>
20
-
21
-void main (int argc, char **argv)
22
-{
23
-	int c;
24
-	extern char *optarg;
25
-	extern int optind;
26
-	int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
27
-	int source = -1 ; /* 0=puits, 1=source */
28
-	while ((c = getopt(argc, argv, "pn:s")) != -1) {
29
-		switch (c) {
30
-		case 'p':
31
-			if (source == 1) {
32
-				printf("usage: cmd [-p|-s][-n ##]\n");
33
-				exit(1);
34
-			}
35
-			source = 0;
36
-			break;
37
-
38
-		case 's':
39
-			if (source == 0) {
40
-				printf("usage: cmd [-p|-s][-n ##]\n");
41
-				exit(1) ;
42
-			}
43
-			source = 1;
44
-			break;
45
-
46
-		case 'n':
47
-			nb_message = atoi(optarg);
48
-			break;
49
-
50
-		default:
51
-			printf("usage: cmd [-p|-s][-n ##]\n");
52
-			break;
53
-		}
54
-	}
55
-
56
-	if (source == -1) {
57
-		printf("usage: cmd [-p|-s][-n ##]\n");
58
-		exit(1) ;
59
-	}
60
-
61
-	if (source == 1)
62
-		printf("on est dans le source\n");
63
-	else
64
-		printf("on est dans le puits\n");
65
-
66
-	if (nb_message != -1) {
67
-		if (source == 1)
68
-			printf("nb de tampons à envoyer : %d\n", nb_message);
69
-		else
70
-			printf("nb de tampons à recevoir : %d\n", nb_message);
71
-	} else {
72
-		if (source == 1) {
73
-			nb_message = 10 ;
74
-			printf("nb de tampons à envoyer = 10 par défaut\n");
75
-		} else
76
-		printf("nb de tampons à envoyer = infini\n");
77
-
78
-	}
79
-}
80
-

+ 0
- 157
tsock_v1_1.c View File

@@ -1,157 +0,0 @@
1
-//--------------------------PROG C ET RESEAUX-----------------------
2
-//Nom : Quintana     -----------------------------------------------
3
-//Prénom : Béranger  -----------------------------------------------
4
-//Groupe : 3AE E     -----------------------------------------------
5
-//------------------------------------------------------------------
6
-
7
-
8
-/* librairie standard ... */
9
-#include <stdlib.h>
10
-/* pour getopt */
11
-#include <unistd.h>
12
-/* déclaration des types de base */
13
-#include <sys/types.h>
14
-/* constantes relatives aux domaines, types et protocoles */
15
-#include <sys/socket.h>
16
-/* constantes et structures propres au domaine UNIX */
17
-#include <sys/un.h>
18
-/* constantes et structures propres au domaine INTERNET */
19
-#include <netinet/in.h>
20
-/* structures retournées par les fonctions de gestion de la base de
21
-données du réseau */
22
-#include <netdb.h>
23
-/* pour les entrées/sorties */
24
-#include <stdio.h>
25
-/* pour la gestion des erreurs */
26
-#include <errno.h>
27
-/* fonctions de tsock*/
28
-#include "tsock.h"
29
-
30
-
31
-/**********************************************************************
32
-Programme Principal
33
-**********************************************************************/
34
-
35
-void main (int argc, char **argv)
36
-{
37
-
38
-  //Déclarations
39
-  
40
-  int c;
41
-  extern char *optarg;
42
-  extern int optind;
43
-  int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
44
-  int source = -1 ; /* 0=puits, 1=source */
45
-  int tcp=1; //tcp=1 => tcp ; tcp=0 =>udp
46
-  struct hostent *hp;
47
-  
48
-  int port = -1; //Numéro de port
49
-  port =htons(port);
50
-  
51
-  char *dest ;
52
-  int lg_local;
53
-  
54
-  while ((c = getopt(argc, argv, "pn:su")) != -1) {
55
-	  
56
-	  
57
-    switch (c) {
58
-    case 'p':
59
-      if (source == 1) {
60
-	printf("usage: cmd [-p|-s][-n ##]\n");
61
-	exit(1);
62
-      }
63
-      source = 0;
64
-      break;
65
-
66
-    case 's':
67
-      if (source == 0) {
68
-	printf("usage: cmd [-p|-s][-n ##]\n");
69
-	exit(1) ;
70
-      }
71
-      dest=argv[argc-2];
72
-      source = 1;
73
-      break;
74
-
75
-    case 'n':
76
-      nb_message = atoi(optarg);
77
-      break;
78
-
79
-    case 'u':
80
-      if (tcp ==0){
81
-	printf("usage : cmd [-p| -s] [-u][-n##]\n");
82
-      }
83
-      tcp=0;
84
-      break;		  	  		        
85
-
86
-    default:
87
-      printf("usage: cmd [-p|-s][-n ##]\n");
88
-      break;
89
-    }
90
-  }
91
-
92
-  if ((port=atoi(argv[argc-1]))!=-1)
93
-    {
94
-      port=htons(port);
95
-    }
96
-  dest=argv[argc-2];
97
-
98
-
99
-  if (source == -1)
100
-    {
101
-      printf("usage: cmd [-p|-s][-n ##]\n");
102
-      exit(1) ;
103
-    }
104
-  if (tcp==1)
105
-    {
106
-      printf("On utilise TCP\n");
107
-    }
108
-  else
109
-    {printf("On utilise UDP\n");}
110
-
111
-
112
-  if (source == 1)
113
-    printf("on est dans le source\n");
114
-  else
115
-    printf("on est dans le puits\n");
116
-	
117
-
118
-  if (nb_message != -1)
119
-    {
120
-    if (source == 1)
121
-      printf("nb de tampons à envoyer : %d\n", nb_message);
122
-    else
123
-      printf("nb de tampons à recevoir : %d\n", nb_message);
124
-    }
125
-  else
126
-    {
127
-    if (source == 1)
128
-      {
129
-	nb_message = 10 ;
130
-	printf("nb de tampons à envoyer = 10 par défaut\n");
131
-      }
132
-    else
133
-      printf("nb de tampons à envoyer = infini\n");	    
134
-
135
-  }
136
-
137
-
138
-  //Envoi de message, Source en UDP
139
-  
140
-  int length_addr_dist;
141
-  length_addr_dist=sizeof(struct sockaddr_in);
142
-
143
-
144
-  
145
-  if(source==1 & tcp==0)
146
-    {
147
-      envoi_UDP(nb_message,port,50);
148
-    }
149
-
150
-  //PUITS de réception en UDP
151
-  
152
-  else if (source==0 & tcp==0)
153
-    {
154
-      reception_UDP(port,nb_message,50);
155
-    }
156
-  exit(0);	
157
-}

BIN
tsock_v3 View File


+ 0
- 189
tsock_v3.c View File

@@ -1,189 +0,0 @@
1
-//--------------------------PROG C ET RESEAUX-----------------------
2
-//Nom :    Quintana  -----------------------------------------------
3
-//Prénom : Béranger  -----------------------------------------------
4
-//Groupe : 3AE E     -----------------------------------------------
5
-//------------------------------------------------------------------
6
-
7
-
8
-/* librairie standard ... */
9
-#include <stdlib.h>
10
-/* pour getopt */
11
-#include <unistd.h>
12
-/* déclaration des types de base */
13
-#include <sys/types.h>
14
-/* constantes relatives aux domaines, types et protocoles */
15
-#include <sys/socket.h>
16
-/* constantes et structures propres au domaine UNIX */
17
-#include <sys/un.h>
18
-/* constantes et structures propres au domaine INTERNET */
19
-#include <netinet/in.h>
20
-/* structures retournées par les fonctions de gestion de la base de
21
-données du réseau */
22
-#include <netdb.h>
23
-/* pour les entrées/sorties */
24
-#include <stdio.h>
25
-/* pour la gestion des erreurs */
26
-#include <errno.h>
27
-/* fonctions de tsock*/
28
-#include "tsock.h"
29
-/* pour afficher l'adresse d'un socket */
30
-#include <arpa/inet.h>
31
-
32
-
33
-/**********************************************************************
34
-Programme Principal
35
-**********************************************************************/
36
-
37
-void main (int argc, char **argv)
38
-{
39
-
40
-  	//Déclarations
41
-  
42
-  	int c;
43
-  	extern char *optarg;
44
-  	extern int optind;
45
-  	int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
46
-  	int source = -1 ; /* 0=puits, 1=source */
47
-  	int tcp=1; //tcp=1 => tcp ; tcp=0 =>udp
48
-  	struct hostent *hp;
49
-  
50
-  	int port = -1; //Numéro de port
51
-  	port =htons(port);
52
-  
53
-  	char *dest ;
54
-  	int lg =30;
55
-  
56
-  	while ((c = getopt(argc, argv, "pn:sul:")) != -1) 
57
-  	{ 
58
-	  
59
-    	switch (c) 
60
-    	{
61
-    		case 'p':
62
-      			if (source == 1) 
63
-      			{
64
-					printf("usage: cmd [-p|-s][-n ##]\n");
65
-					exit(1);
66
-      			}
67
-      			source = 0;
68
-      		break;
69
-
70
-    		case 's':
71
-      			if (source == 0) 
72
-      			{
73
-    				printf("usage: cmd [-p|-s][-n ##]\n");
74
-					exit(1) ;
75
-      			}
76
-      			dest=argv[argc-2];
77
-      			source = 1;
78
-      		break;
79
-
80
-    		case 'n':
81
-      			nb_message = atoi(optarg);
82
-            if (nb_message>100000)
83
-            {
84
-              printf("Trop d'envois, n> 100 000\n");
85
-              exit (1);
86
-            }
87
-      		break;	
88
-
89
-    		case 'u':
90
-      			tcp=0;
91
-      		break;
92
-
93
-          case 'l':
94
-            lg = atoi(optarg);
95
-          break;  	  		        
96
-
97
-		    default:
98
-    			printf("usage: cmd [-p|-s][-n ##]\n");
99
-      		break;
100
-    	}
101
-  	}
102
-
103
-  	if ((port=atoi(argv[argc-1]))!=-1)
104
-    {
105
-      port=htons(port);
106
-    }
107
-  	dest=argv[argc-2];
108
-
109
-  	if (source == -1)
110
-    {
111
-    	printf("usage: cmd [-p|-s][-n ##]\n");
112
-      exit(1) ;
113
-    }
114
-
115
-  	if (source == 1)
116
-    	printf("SOURCE : ");
117
-  	else
118
-    	printf("PUITS : ");
119
-
120
-  	
121
-  	if (tcp==1)
122
-    	printf("Protocole de transport : TCP | ");
123
-    
124
-  	else
125
-    	printf("Protocole de transport : UDP | ");
126
-
127
-  	if (nb_message == -1)
128
-  	{
129
-
130
-    	if (source == 1)
131
-    	{	
132
-    		nb_message = 10;
133
-      		printf("Nombre d'envois : %d | ", nb_message);
134
-    	}
135
-    	else
136
-      		printf("Nombre de receptions : infini | ");
137
-    }
138
-
139
-  	else
140
-    {
141
-    	if (source == 1)
142
-    	{
143
-			
144
-			printf("Nombre d'envois = %d | ", nb_message);
145
-    	}
146
-    	else
147
-    	{
148
-    		printf("nb de tampons à recevoir = %d | ",nb_message);	
149
-    	}	
150
-    }
151
-
152
-    printf("Destinataire : %s\n", dest);
153
-
154
-
155
-  	//Envoi de message, Source en UDP
156
-  
157
-  	int length_addr_dist;
158
-  	length_addr_dist=sizeof(struct sockaddr_in);
159
-
160
-  
161
-  	if(source==1 & tcp==0)
162
-    {
163
-      envoi_UDP(port,nb_message,lg,dest);
164
-    }
165
-
166
-  	//PUITS de réception en UDP
167
-  
168
-  	else if (source==0 & tcp==0)
169
-    {
170
-      reception_UDP(port,nb_message,lg);
171
-    }
172
-
173
-
174
-  	else if (source==0 & tcp==1)
175
-  	{
176
-    	
177
-    	ServeurTCP(port, nb_message, lg);
178
-  	}
179
-
180
-  	else if (source==1 & tcp==1)
181
-  	{
182
-    	
183
-    	ClientTCP(port,nb_message,lg,dest);
184
-  	}
185
-
186
-	exit(0); 
187
-}
188
-
189
-

+ 258
- 0
tsock_vf.c View File

@@ -0,0 +1,258 @@
1
+//--------------------------PROG C ET RESEAUX-----------------------
2
+//                          Nom :    Quintana
3
+//                          Prénom : Béranger
4
+//                             Grp : 3AE E
5
+//------------------------------------------------------------------
6
+
7
+
8
+/* librairie standard ... */
9
+#include <stdlib.h>
10
+/* pour getopt */
11
+#include <unistd.h>
12
+/* déclaration des types de base */
13
+#include <sys/types.h>
14
+/* constantes relatives aux domaines, types et protocoles */
15
+#include <sys/socket.h>
16
+/* constantes et structures propres au domaine UNIX */
17
+#include <sys/un.h>
18
+/* constantes et structures propres au domaine INTERNET */
19
+#include <netinet/in.h>
20
+/* structures retournées par les fonctions de gestion de la base de
21
+données du réseau */
22
+#include <netdb.h>
23
+/* pour les entrées/sorties */
24
+#include <stdio.h>
25
+/* pour la gestion des erreurs */
26
+#include <errno.h>
27
+/* fonctions de tsock*/
28
+#include "tsock.h"
29
+/* fonctions de BAL */
30
+#include "bal.h"
31
+/* pour afficher l'adresse d'un socket */
32
+#include <arpa/inet.h>
33
+
34
+
35
+//----------------------------------------------------------------------
36
+//                        Programme Principal
37
+//----------------------------------------------------------------------
38
+
39
+void main (int argc, char **argv)
40
+{
41
+
42
+  	//Déclarations
43
+  
44
+  	int c;
45
+  	extern char *optarg;
46
+  	extern int optind;
47
+  	int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
48
+  	int source = -1 ; /* 0=puits, 1=source */
49
+  	int tcp=1; //tcp=1 => tcp ; tcp=0 =>udp
50
+  	struct hostent *hp;
51
+    int bal=-1;
52
+  	int port = -1; //Numéro de port
53
+    int recep=-1;
54
+  	port =htons(port);
55
+  	int nb_lettres=3;
56
+    int nBAL=-1;
57
+  	char *dest ;
58
+  	int lg =30;
59
+  
60
+  	while ((c = getopt(argc, argv, "pn:sul:be:r:")) != -1) 
61
+  	{
62
+    	switch (c) 
63
+    	{
64
+    		case 'p':
65
+      			if (source == 1) 
66
+      			{
67
+                    printf("ATTENTION :\n On ne peut être source et puits en même temps, Veuillez enlever une des deux options -s ou -p\n\n");
68
+					exit(1);
69
+      			}
70
+      			source = 0;
71
+      		break;
72
+    		case 's':
73
+      			if (source == 0) 
74
+      			{
75
+    				  printf("ATTENTION :\n On ne peut être source et puits en même temps, Veuillez enlever une des deux options -s ou -p\n\n");
76
+    				  exit(1) ;
77
+      			}
78
+      			dest=argv[argc-2];
79
+      			source = 1;
80
+      		break;
81
+            case 'b' :
82
+                if (source!=-1)
83
+                {
84
+                    printf("ATTENTION :\nOn ne peut utiliser le service de Boite aux lettres et l'usage classique de TCP|UDP en même temps.\nVeuillez retirer une des options -b ou -s|-p\n\n");
85
+                    exit(1);
86
+                }
87
+                bal=1;
88
+                break;
89
+            case 'e' :
90
+                if (source!=-1)
91
+                {
92
+                    printf("ATTENTION :\nOn ne peut utiliser le service de Boite aux lettres et l'usage classique de TCP|UDP en même temps.\nVeuillez retirer une des options -e ou -s|-p\n\n");
93
+                    exit(1);
94
+                }
95
+                if (recep==1)
96
+                {
97
+                    printf("On ne peut pas être émetteur et récepteur, -r ou -e, pas les deux\n");
98
+                    exit(1);
99
+                }
100
+                bal=1;
101
+                recep=0;
102
+                nBAL = atoi(optarg);
103
+                break;
104
+            case 'r' :
105
+                if (recep==0)
106
+                {
107
+                    printf("On ne peut être émetteur et récepteur en même temps : -e ou -r mais pas les deux\n");
108
+                    exit(1);
109
+                }
110
+                bal=1;
111
+                recep=1;
112
+                nBAL = atoi(optarg);
113
+                break;
114
+    		case 'n':
115
+      			nb_message = atoi(optarg);
116
+                if (nb_message>100000)
117
+                {
118
+                    printf("Trop d'envois, n> 100 000\n");
119
+                    exit (1);
120
+                }
121
+                if (recep==1)
122
+                {
123
+                    printf("ATTENTION :\nVous devez récupérer l'intégralité du contenu de la BAL. Vous ne pouvez donc pas fixer n\n\n");
124
+                    exit(1);
125
+                }
126
+      		break;
127
+    		case 'u':
128
+      			tcp=0;
129
+      			if (bal!=-1)
130
+                {
131
+      			    printf("ATTENTION : \nL'envoi sur BAL ne se fait que via TCP, Veuillez enlever l'option -u\n\n");
132
+      			    exit(1);
133
+                }
134
+      		break;
135
+            case 'l':
136
+                lg = atoi(optarg);
137
+                if (lg>maxsize)
138
+                {
139
+                    printf("Taille des messages supérieure à la limite fixée à %d\n",maxsize);
140
+                }
141
+                if (recep==1)
142
+                {
143
+                    printf("ATTENTION :\nVous devez récupérer l'intégralité du contenu de la BAL. Vous ne pouvez donc pas fixer l\n\n");
144
+                    exit(1);
145
+                }
146
+            break;
147
+		    default:
148
+    			printf("usage: ./tsock [-p|-s] ou [-b|-e|-r] [-n ##]\n");
149
+    			exit(1);
150
+      		break;
151
+    	}
152
+  	}
153
+
154
+
155
+  	if ((port=atoi(argv[argc-1]))!=-1)
156
+    {
157
+        port=htons(port);
158
+    }
159
+
160
+  	dest=argv[argc-2];
161
+
162
+  	if (source == -1 & bal ==-1)
163
+    {
164
+    	printf("usage: ./tsock [-p|-s] ou [-b|-e|-r] + [-n ##]\n");
165
+        exit(1) ;
166
+    }
167
+
168
+//Service Partie 1 Sans BAL
169
+    if (bal == -1)
170
+    {
171
+        if (source == 1)
172
+            printf("SOURCE : ");
173
+        else
174
+            printf("PUITS : ");
175
+
176
+      
177
+        if (tcp==1)
178
+            printf("Protocole de transport : TCP | ");
179
+      
180
+        else
181
+            printf("Protocole de transport : UDP | ");
182
+
183
+        if (nb_message == -1)  //Attribution du nombre de message à envoyer/recevoir si absence de -n XX
184
+        {
185
+            if (source == 1)
186
+            {
187
+                nb_message = 10;
188
+                printf("Nombre d'envois : %d | ", nb_message);
189
+            }
190
+            else
191
+                printf("Nombre de receptions : infini | ");
192
+        }
193
+
194
+        else
195
+        {
196
+            if (source == 1)
197
+                printf("Nombre d'envois = %d | ", nb_message);
198
+            else
199
+                printf("nb de tampons à recevoir = %d | ",nb_message);
200
+        }
201
+
202
+        printf("Destinataire : %s\n", dest);
203
+
204
+
205
+    //Envoi de message, Source en UDP
206
+
207
+        if(source==1 & tcp==0)
208
+            envoi_UDP(port,nb_message,lg,dest);
209
+
210
+
211
+    //PUITS de réception en UDP
212
+        else if (source==0 & tcp==0)
213
+            reception_UDP(port,nb_message,lg);
214
+
215
+    //Envoi de message en TCP
216
+        else if (source==0 & tcp==1)
217
+            ServeurTCP(port, nb_message, lg);
218
+
219
+        else if (source==1 & tcp==1)
220
+            ClientTCP(port,nb_message,lg,dest);
221
+    }
222
+    else //Partie 2 : UDP,TCP+BAL
223
+    {
224
+        if (nb_message == -1)  //Attribution du nombre de message à envoyer/recevoir si absence de -n XX
225
+        {
226
+            if (recep == 0)
227
+                nb_message = 10;
228
+
229
+        }
230
+        if (bal==1 &recep==-1)
231
+        {
232
+            printf("____________________________________________________________________\n\n");
233
+            printf("                             SERVEUR BAL                            \n");
234
+            printf("____________________________________________________________________\n\n");
235
+            SBAL(port, dest);
236
+        }
237
+
238
+        else if (bal==1 & recep ==0)
239
+        {
240
+            printf("____________________________________________________________________\n\n");
241
+            printf("                             EMETTEUR BAL                           \n");
242
+            printf("____________________________________________________________________\n\n");
243
+            EBAL(port, dest,nb_message,lg, nBAL);
244
+        }
245
+
246
+        else if(bal==1 &recep == 1)
247
+        {
248
+            printf("____________________________________________________________________\n\n");
249
+            printf("                            RECEPTEUR BAL                           \n");
250
+            printf("____________________________________________________________________\n\n");
251
+            RBAL(port,dest,nBAL);
252
+        }
253
+    }
254
+
255
+	exit(0);
256
+}
257
+
258
+

Loading…
Cancel
Save