Pg serveur tcp sur linux

tacha84 -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,j'ai un exercice à faire c très urgent pour demin

realiser le programme d'un serveur TCP qui prend en argument un numero de port.Ce serveur crée une socket et l'attache à ce numéro de ort.ensuite,il doit commencer par écoter le réseau en attente des demandes de connexios et accepter jusqu'à deux connexions avant de fermer les socket.Pour chaque connexion acceptée,il doit afficher l'adresse du client et le descripteur de la nouvelle socket de service.Après avoir accepté deux connexions,il doit attendre la frappe d'une touche pour fermer toutes les socket.

j'ai realisé ce programme mais je sais pas est ce qu'il marche ou pas car j'ai pas d'unix sur mon pc.svp qq'un l'execute et m envoie un imprime ecran de l'execution sur mon mail ca_winners_ca@hotmail.com.merci beaucoup.
c trè ur

#include<stdio.h>
#include<unistd.h>
#include<sys/typees.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<netdb.h>
#include<stdlib.h>
int main(int arg c,char **argv)
{
int i,res,sock_ecoute,sock_srvice(2),taille_adr;
struct sockaddr_in adresse_loc,adresse_dist;
char c;
if (argc!=2){
printf("usage:%s<port_num\n",argv[0]);
exit(1);
}

/*creation de socket

sock_ecoute=socket(AF_INET,SOCK_STRAEM,0);
if(sock_ecoute==-1){
perror("socket");
exit(2);
}
else printf("socket cree\n");

/* preparation de l'adresse locale

adresse_loc.sin_family=AF_INET;
adresse_loc.sin_port=htons(atoi(argv[1]));
adresse_loc.sin_addr.s_addr=hton1(INADDR_ANY); /*INADDR_ANY donne ladresse ip de la machine locale*/

/*attachement du socket

res=bind'sock_ecoute,(struct sockaddr *)&adresse_loc,sizeof(*adresse_loc));
if (res==-i){
perror(bind");
exit(3);
}
else
printtf("socket attaché\n");
printf"serveur TCP sur port numéro %d\n",adresse_loc.sin_port);

/*debut de l'ecoute

res=listen(sock_ecoute,10);
if(res==-1){
perror("listen");
exit(4);
}
else
printf("Serveur TCP commence l'ecoute\n");

/*prise en compte de deux connexions

taille_adr=sizeof(adresse_dist);
for(i=0;i<1;i++){
sock_service[i]=accept(sock_ecoute,(struct sockaddr *)&adresse_dist,&taille_adr);
if(res==-1){
perror("accept");
}
printf("demande de connexion venant de l'hote %s\n" inet_ntoa(adresse_dist.sin_addr));
printf("descripteur du socket de service %d\n",sock_service[i]);
if(i==0)
printf("serveur attend seconde connexion\n");
else
printf("les deux connexions se sont bien deroulées\n");
}
printf("RETURN pour deconnecter les sockets du serveur\n");
scanf("%c",&c); /*attente d'un return*/

/*fermeture des deux socket de service

for(i=0;i<2;i++)
{
res=close(sock_service[i]);
if(res==-1)
{
perror("close");
}
}

/*fermeture de socket d'ecoute

res=close(sock_ecoute);
if (res==-1){
perror(close socket d'ecoute");
exit(5);
}
reeturn(0);
Configuration: Windows XP
Firefox 2.0.0.11

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Le truc c'est qu'en postant ton sujet à 22h50 pour le lendemain tu ne mets pas toutes les chances de ton côté :s

    Malheureusement ce programme n'a hélas aucune chance de compiler car il y a beaucoup de fautes :
    1) les commentaires /* doivent être fermé par */ :
    /*creation de socket */
    ...

    2) il manque des guillemets
    perror("bind");
    perror("close socket d'ecoute");

    3) il y a un e en trop à return, l'accolade du main n'est pas fermée. il y a un e en trop à #include<sys/typees.h>
    4) return n'est pas une fonction donc pas de parenthèse :
    return 0;

    5) tu as écris arg c au lieu de argc
    6) il y a des problèmes de parenthèses
    res=bind(sock_ecoute,(struct sockaddr *)&adresse_loc,sizeof(*adresse_loc));
    printf("serveur TCP sur port numéro %d\n",adresse_loc.sin_port);

    7) ... des fautes de frappes :
    int i,res,sock_ecoute,sock_service(2),taille_adr;
    sock_ecoute=socket(AF_INET,SOCK_STREAM,0);

    8) ... et des virgules manquantes :
    printf("demande de connexion venant de l'hote %s\n",inet_ntoa(adresse_dist.sin_addr));


    Voici une version partiellement corrigée (mais qui ne compile pas et vu l'heure je vais m'arrêter là) :
    #include<stdio.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<sys/un.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<stdlib.h>
    
    int main(int argc,char **argv){
        int i,res,sock_ecoute,sock_service(2),taille_adr;
        struct sockaddr_in adresse_loc,adresse_dist;
        char c;
        if (argc!=2){
            printf("usage:%s<port_num\n",argv[0]);
            exit(1);
        }
    
        //creation de socket
    
        sock_ecoute=socket(AF_INET,SOCK_STREAM,0);
        if(sock_ecoute==-1){
            perror("socket");
            exit(2);
        }
        else printf("socket cree\n");
    
        // preparation de l'adresse locale
    
        adresse_loc.sin_family=AF_INET;
        adresse_loc.sin_port=htons(atoi(argv[1]));
        adresse_loc.sin_addr.s_addr=hton1(INADDR_ANY); //INADDR_ANY donne ladresse ip de la machine locale*/
    
        //attachement du socket
    
        res=bind(sock_ecoute,(struct sockaddr *)&adresse_loc,sizeof(*adresse_loc));
        if (res==-i){
            perror("bind");
            exit(3);
        }
        else printf("socket attaché\n");
        printf("serveur TCP sur port numéro %d\n",adresse_loc.sin_port);
    
        //debut de l'ecoute
    
        res=listen(sock_ecoute,10);
        if(res==-1){
            perror("listen");
            exit(4);
        }
        else
            printf("Serveur TCP commence l'ecoute\n");
    
        //prise en compte de deux connexions
    
        taille_adr=sizeof(adresse_dist);
        for(i=0;i<1;i++){
            sock_service[i]=accept(sock_ecoute,(struct sockaddr *)&adresse_dist,&taille_adr);
            if(res==-1){
                perror("accept");
            }
            printf("demande de connexion venant de l'hote %s\n",inet_ntoa(adresse_dist.sin_addr));
            printf("descripteur du socket de service %d\n",sock_service[i]);
            if(i==0)
                printf("serveur attend seconde connexion\n");
            else
                printf("les deux connexions se sont bien deroulées\n");
        }
        printf("RETURN pour deconnecter les sockets du serveur\n");
        scanf("%c",&c); //attente d'un return*/
    
        //fermeture des deux socket de service
    
        for(i=0;i<2;i++)
        {
            res=close(sock_service[i]);
            if(res==-1)
            {
                perror("close");
            }
        }
    
        //fermeture de socket d'ecoute
    
        res=close(sock_ecoute);
        if (res==-1){
            perror("close socket d'ecoute");
            exit(5);
        }
        return 0;
    }
    

    Il reste encore les erreurs :
    (mando@aldur) (~) $ g++ -W -Wall plop.cpp
    plop.cpp: In function ‘int main(int, char**)’:
    plop.cpp:32: error: ‘hton1’ was not declared in this scope
    plop.cpp:36: error: no match for ‘operator*’ in ‘*adresse_loc’
    plop.cpp:58: error: invalid types ‘int[int]’ for array subscript
    plop.cpp:58: error: invalid conversion from ‘int*’ to ‘socklen_t*’
    plop.cpp:58: error:   initializing argument 3 of ‘int accept(int, sockaddr*, socklen_t*)’
    plop.cpp:62: error: ‘inet_ntoa’ was not declared in this scope
    plop.cpp:63: error: invalid types ‘int[int]’ for array subscript
    plop.cpp:76: error: invalid types ‘int[int]’ for array subscript

    Afin que tu puisse travailler sous windows je t'invite très fortement :

    1) soit à installer putty et à te connecter à un serveur linux :
    https://www.chiark.greenend.org.uk/~sgtatham/putty/

    2) soit à installer un environnement C++ comme dev-cpp ou code::blocks
    http://www.bloodshed.net/
    http://www.codeblocks.org/

    3) soit à installer cygwin (pour avoir sous windows l'équivalent d'un linux). Tu peux en outre installer un compilateur (g++), et openssh (en particulier le client ssh) pour pouvoir te connecter en ssh sur un serveur linux si besoin
    http://www.cygwin.com/

    4) soit installer linux :-)

    Bonne chance
    0