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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
| #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)
#define DECONNECTE 0
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
/*int traiter_requete(int csock)
{
char* buf;
int read_ret;
while ( (read_ret = read( csock, buf, sizeof buf )) > 0 )
{
buf[read_ret]='\0';
printf( "%s\n", buf );
write(csock,buf,BUFSIZ);
}
if (read_ret == 0) {
printf( "connection closed by distant peer");
return DECONNECTE;
}
if ( read_ret < 0 ) {
char s[BUFSIZ];
sprintf( s, "error reading socket" );
perror(s);
exit(__LINE__);
return DECONNECTE;
}
}*/
int main(int argc, char *argv[])
{
//Socket et contexte d'adressage du serveur
SOCKADDR_IN sin;
SOCKET sock;
//char buffer[32];
//char buffer1[256] = "GET /page.html HTTP/1.1";
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;
int pid;
int l;
/* 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));
if ((l=read(csock,buf,BUFSIZ))>0)
{
buf[l]=0;
sock_err = write(csock, buf, l);
if(sock_err != SOCKET_ERROR)
printf("Chaine envoyée : %s\n", buf);
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");
/*if((pid=fork()) < 0)
{
perror(argv[0]);
exit(__LINE__);
}
if (pid==0)
{
close(sock);
while(1)
{
sleep(1);
switch(traiter_requete(csock))
{
case DECONNECTE:
exit(1);
break;
default:
break;
}
}
}
else
{
close(csock);
}*/
//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;
} |