Pg serveur tcp sur linux

Fermé
tacha84 - 17 janv. 2008 à 22:50
mamiemando
Messages postés
31045
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mai 2022
- 18 janv. 2008 à 00:07
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);

1 réponse

mamiemando
Messages postés
31045
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mai 2022
7 344
18 janv. 2008 à 00:07
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