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
|
#include<stdio.h>
//#include<sys/types.h>
//#include<sys/socket.h>
//#include<netinet/in.h>
//#include<netdb.h>
#include<winsock2.h>
#include"fonction.h"
#define DEFPORTBASE 0
/* ce programme alloue un socket correspondant aux arguments passés */
/* par le programme appelant */
int setsock(char *service,char *protocol,int queue_len)
/* le numéro de port ou nom d'un service connu */
//char *service;
/* nom du protocole utilisé TCP ou UDP */
//char *protocole;
/* nombre maximum de clients en attente sur le socket */
//int queue_len;
{
struct servent *pse; /* pointeur sur la structure d'info du service */
struct protoent *ppe; /* pointeur sur la structure d'info du protocole */
struct sockaddr_in server_in; /* structure d'info sur l'adresse du serveur */
int sock; /* descripteur de socket */
int socket_type; /* type associé au socket : STREAM ou DATAGRAM */
u_short portbase = DEFPORTBASE;
/* mise en place de la structure d'information sur le serveur : server_in */
/* initialisation de la structure server_in à 0 */
bzero((char*)&server_in,sizeof(server_in));
/* mise en place de la famille d'adresse */
server_in.sin_family = AF_INET;
server_in.sin_addr.s_addr = INADDR_ANY;
/* mise en place du numéro de port du service */
if(pse = getservbyname(service,protocol))
{
/* cas où le service est désigné par son nom */
server_in.sin_port = htons(ntohs((u_short)pse->s_port)+portbase);
}
/* cas où le service est désigné par un numéro de port */
else if(server_in.sin_port = htons((u_short)atoi(service))==0)
{
/* cas d'erreur sur le service */
printf("ce service n'exite pas : %s\n",service);
exit(1);
}
/* mise en place de la structure d'information sur le protocole */
if((ppe = getprotobyname(protocol))==0)
{
printf("Protocole %s inconnu \n",protocol);
getch();
exit(1);
}
/* allocation de socket */
if(strcmp(protocol,"udp")==0) socket_type = SOCK_DGRAM;
else socket_type = SOCK_STREAM;
/* création du socket avec le protocole choisi */
sock = socket(PF_INET,socket_type,ppe->p_proto);
if(sock<0)
{
printf("impossible de créer un socket : \n");
exit(1);
}
/* lien avec le port */
if(bind(sock,(struct sockaddr*)&server_in,sizeof(server_in))<0)
{
printf("impossible de lier le port %s",service);
exit(1);
}
/* on met le socket en mode passif dans le cas d'un serveur fonctionnant */
/* en mode connecté */
if(socket_type == SOCK_STREAM)
{
if(listen(sock,queue_len)<0)
{
printf("impossible de mettre le port %s en attente de requètes \n",service);
exit(1);
}
}
/* on renvoie le descripteur de socket alloué */
return(sock);
}
/* fin de setsock */ |
Partager