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
| #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
int main(int argc, char *argv[])
{
//Socket et contexte d'adressage du serveur
SOCKADDR_IN sin;
SOCKET sock;
char buffer[32];
unsigned int recsize = (unsigned int) sizeof sin;
// Socket et contexte d'adressage du client
SOCKADDR_IN csin;
SOCKET csock;
unsigned int crecsize = (unsigned int) sizeof csin;
int sock_err;
char buf[BUFSIZ];
int read_ret;
/* Création d'une socket */
sock = socket(AF_INET, SOCK_STREAM, 0);
/* Si la socket est valide */
if(sock != INVALID_SOCKET)
{
printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
/* Configuration */
sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */
sin.sin_family = AF_INET; /* Protocole familial (IP) */
sin.sin_port = 0 ; /* Listage du port */
sock_err = bind(sock, (SOCKADDR *) &sin, recsize);
/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Démarrage du listage (mode server) */
if ( getsockname(sock,(SOCKADDR *) &sin,(int*)&recsize ) < 0 )
{
char s[BUFSIZ];
sprintf( s, "%s: can't get port number of socket (%d)", argv[0], sock );
perror(s);
exit(__LINE__);
}
sock_err = listen(sock, 5);
printf("Listage du port %d...\n",ntohs(sin.sin_port));
/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Attente pendant laquelle le client se connecte */
printf("Patientez pendant que le client se connecte sur le port
%d...\n", ntohs(sin.sin_port));
csock = accept(sock, (SOCKADDR *) &csin, &crecsize);
printf("Un client se connecte avec la socket %d de %s:%d\n",
csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
sock_err = send(csock, buffer, 32, 0);
if(sock_err != SOCKET_ERROR)
printf("Chaine envoyée : %s\n", buffer);
else
printf("Erreur de transmission\n");
}
/* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */
shutdown(csock, 2);
}
else
perror("listen");
}
else
perror("bind");
while ( (read_ret = read( csock, buf, sizeof buf )) > 0 )
{
buf[read_ret]='\0';
printf( "%s", buf );
}
if (read_ret == 0) {
printf( "%s: connection closed by distant peer:\n", argv[0] );
}
if ( read_ret < 0 ) {
char s[BUFSIZ];
sprintf( s, "%s: error reading socket", argv[0] );
perror(s);
exit(__LINE__);
}
/* Fermeture de la socket client et de la socket serveur */
printf("Fermeture de la socket client\n");
closesocket(csock);
printf("Fermeture de la socket serveur\n");
closesocket(sock);
printf("Fermeture du serveur terminée\n");
}
else
perror("socket");
return EXIT_SUCCESS;
} |
Partager