1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUFFER_SIZE 256
int cree_socket_tcp_ip()
{
int sock;
struct sockaddr_in adresse;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
fprintf(stderr, "Erreur socket\n");
return -1;
}
memset(&adresse, 0, sizeof(struct sockaddr_in));
adresse.sin_family = AF_INET;
// donner un num�ro de port disponible quelconque
// adresse.sin_port = htons(0);
// aucun contr�le sur l'adresse IP :
//adresse.sin_addr.s_addr = htons(INADDR_ANY);
// Autre exemple :
// connexion sur le port 33016 fix�
adresse.sin_port = htons(33016);
// depuis localhost seulement :
inet_aton("127.0.1.1", &adresse.sin_addr);
if (bind(sock, (struct sockaddr *)&adresse,
sizeof(struct sockaddr_in)) < 0)
{
close(sock);
fprintf(stderr, "Erreur bind\n");
return -1;
}
return sock;
}
int affiche_adresse_socket(int sock)
{
struct sockaddr_in adresse;
socklen_t longueur;
longueur = sizeof(struct sockaddr_in);
if (getsockname(sock, (struct sockaddr *)&adresse, &longueur) < 0)
{
fprintf(stderr, "Erreur getsockname\n");
return -1;
}
printf("IP = %s, Port = %u\n", inet_ntoa(adresse.sin_addr),
ntohs(adresse.sin_port));
return 0;
}
void traite_connection(int sock)
{
struct sockaddr_in adresse;
socklen_t longueur;
char bufferR[BUFFER_SIZE];
char bufferW[BUFFER_SIZE];
char tmp[50];
int nb;
longueur = sizeof(struct sockaddr_in);
if (getpeername(sock, (struct sockaddr*) &adresse, &longueur) < 0)
{
fprintf(stderr, "Erreur getpeername\n");
return;
}
sprintf(bufferW, "IP = %s, Port = %u\n",
inet_ntoa(adresse.sin_addr),
ntohs(adresse.sin_port));
printf("Connexion : locale (sock_connectee) ");
affiche_adresse_socket(sock);
printf(" Machine distante : %s", bufferW);
strcat(bufferW, "Votre adresse : ");
affiche_adresse_socket(sock);
strcat(bufferW, tmp);
strcat(bufferW, "Veuillez entrer une phrase : ");
write(sock, bufferW, BUFFER_SIZE);
nb= read(sock, bufferR, BUFFER_SIZE);
printf("L'utilsateur distant a tap� : %s\n", bufferR);
sprintf(bufferW, "Vous avez tap� : %s\n", bufferR);
write(sock, bufferW, BUFFER_SIZE);
}
int main(void)
{
int sock_contact;
int sock_connectee;
struct sockaddr_in adresse;
socklen_t longueur;
pid_t pid_fils;
sock_contact = cree_socket_tcp_ip();
if (sock_contact < 0)
return -1;
listen(sock_contact, 5);
printf("Mon adresse (sock contact) -> ");
affiche_adresse_socket(sock_contact);
while (1)
{
longueur = sizeof(struct sockaddr_in);
sock_connectee = accept(sock_contact,
(struct sockaddr *)&adresse,
&longueur);
if (sock_connectee < 0)
{
fprintf(stderr, "Erreur accept\n");
return -1;
}
pid_fils = fork();
if (pid_fils == -1)
{
fprintf(stderr, "Erreur fork\n");
return -1;
}
if (pid_fils == 0)
{ /* fils */
close(sock_contact);
traite_connection(sock_connectee);
exit(0);
}
else
{
close(sock_connectee);
}
}
return 0;
} |
Partager