begin process at 2012 05 28 08:49:39
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Client/Serveur Linux


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Client/Serveur Linux

mercredi 30 novembre 2005 à 13:36:53 | Client/Serveur Linux

imothepe20012002

Salut a tous !
Voila, j'ai un tp a rendre, je dois faire sous linux (terminale) un bibliothéque en ligne. Je m'explique, un serveur posséde des files et lorsque le client ce connecte, il doit lui proposer les files (pour cela le serveur fait un recheche dans sont répertoire d'execution). Le client recupére alors les fichiers qu'il veux.

J'arrive a faire dialoguer le serveur et les clients. Mais je c pas comment faire pour faire la biblio, pouvez vous m'aidez....merci

Voic le code source serveur:

/* include fig01 */
#include    "unp.h"

int
main(int argc, char **argv)
{
    int                    i, maxi, maxfd, listenfd, connfd, sockfd;
    int                    nready, client[FD_SETSIZE];
    ssize_t                n;
    fd_set                rset, allset;
    char                buf[MAXLINE];
    socklen_t            clilen;
    struct sockaddr_in    cliaddr, servaddr;

    listenfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family      = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port        = htons(SERV_PORT);

    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

    Listen(listenfd, LISTENQ);

    maxfd = listenfd;            /* initialize */
    maxi = -1;                    /* index into client[] array */
    for (i = 0; i < FD_SETSIZE; i++)
        client[i] = -1;            /* -1 indicates available entry */
    FD_ZERO(&allset);
    FD_SET(listenfd, &allset);
/* end fig01 */

/* include fig02 */
    for ( ; ; ) {
        rset = allset;        /* structure assignment */
        nready = Select(maxfd+1, &rset, NULL, NULL, NULL);

        if (FD_ISSET(listenfd, &rset)) {    /* new client connection */
            clilen = sizeof(cliaddr);
            connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
#ifdef    NOTDEF
            printf("new client: %s, port %d\n",
                    Inet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL),
                    ntohs(cliaddr.sin_port));
#endif

            for (i = 0; i < FD_SETSIZE; i++)
                if (client[i] < 0) {
                    client[i] = connfd;    /* save descriptor */
                    break;
                }
            if (i == FD_SETSIZE)
                err_quit("too many clients");

            FD_SET(connfd, &allset);    /* add new descriptor to set */
            if (connfd > maxfd)
                maxfd = connfd;            /* for select */
            if (i > maxi)
                maxi = i;                /* max index in client[] array */

            if (--nready <= 0)
                continue;                /* no more readable descriptors */
        }

        for (i = 0; i <= maxi; i++) {    /* check all clients for data */
            if ( (sockfd = client[i]) < 0)
                continue;
            if (FD_ISSET(sockfd, &rset)) {
                if ( (n = Read(sockfd, buf, MAXLINE)) == 0) {
                        /*4connection closed by client */
                    Close(sockfd);
                    FD_CLR(sockfd, &allset);
                    client[i] = -1;
                } else
                    Writen(sockfd, buf, n);

                if (--nready <= 0)
                    break;                /* no more readable descriptors */
            }
        }
    }
}
/* end fig02 */


##############################################################################

Client:
using namespace std;
#include <string.h>//pour memcpy au moins
#include <stdio.h>//perror
#include <sys/types.h>
#include <iostream>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <fstream>
#include "sock.h"
#include "sockdist.h"

main(int argc, char*argv[]){
static const int MAXLINE=128;
  if (argc<2){
    cout<<"utilisation: "<<argv[0]<<" mach_distante" <<endl;
    exit(1);
  }

  /* une BR locale */
 
  int     i, maxi, maxfd, listenfd, connfd, sockfd;
  int     nready, client[FD_SETSIZE];
  ssize_t n;
  fd_set  rset, allset;
  socklen_t  clilen;
  char    buf[MAXLINE];
  Sock maBr(SOCK_STREAM, (short)31469,0);
  int descmaBr;
   if (maBr.good()) descmaBr=maBr.getsDesc();//on recupere le descripteur
  else {
    cout<<"pb BR locale"<<endl;
    exit(1);
  }
  listen(descmaBr,32);
  struct sockaddr_in cliaddr, servaddr;
   maxfd = listenfd;            /* initialize */
     maxi = -1;                   /* index into client[] array */
     for (i = 0; i < FD_SETSIZE;  i++)
         client[i] = -1;          /* -1 indicates available entry */
     FD_ZERO(&allset);
     FD_SET(descmaBr, &allset);

  for ( ; ; ) {
        rset = allset;        /* structure assignment */
        nready = select(maxfd+1, &rset, NULL, NULL, NULL);

        if (FD_ISSET(descmaBr, &rset)) {    /* new client connection */
            clilen = sizeof(cliaddr);
            connfd = accept(descmaBr, (struct sockaddr *) &cliaddr, &clilen);
                char *strptr;
            //printf("new client: %s, port %d\n",
        //maBr.inet_ntop(AF_INET, &cliaddr.sin_addr,strptr ,4);
            //        ntohs(cliaddr.sin_port));
        //cout<<"adresse de client:"<<strptr<<endl;

            printf("new client: %s, port %d\n",
                    inet_ntop(AF_INET, &cliaddr.sin_addr, strptr,4),
                    ntohs(cliaddr.sin_port));
                        cout<<"descriptors de client:"<<connfd<<endl;
            for (i = 0; i < FD_SETSIZE; i++)
                if (client[i] < 0) {
                    client[i] = connfd;    /* save descriptor */
                    break;
                }
            if (i == FD_SETSIZE)
                //err_quit("too many clients");
                                  exit(1);
            FD_SET(connfd, &allset);    /* add new descriptor to set */
            if (connfd > maxfd)
                maxfd = connfd;            /* for select */
            if (i > maxi)
                maxi = i;                /* max index in client[] array */

            if (--nready <= 0)
                continue;                /* no more readable descriptors */
        }

        for (i = 0; i <= maxi; i++) {    /* check all clients for data */
            if ( (sockfd = client[i]) < 0)
                continue;
            if (FD_ISSET(sockfd, &rset)) {
                if ( (n = read(sockfd, buf, MAXLINE)) == 0) {
                        /*4connection closed by client */
                    close(sockfd);
                    FD_CLR(sockfd, &allset);
                    client[i] = -1;
                    cout<<"close client: "<<endl;
                } else {
                        if(strcmp(buf,"quit\n")==0){
                     char bb[]="bye-bye\n";
                     maBr.writen(sockfd, bb, MAXLINE);
                     close(sockfd);
                     FD_CLR(sockfd, &allset);
                     client[i] = -1;
                     cout<<"close client a la main: "<<endl;
                     break;
                     }
                     char charClient[MAXLINE]="from server: ";
                                     int nn=strlen(charClient);
                                      for(int i=0;i<strlen(buf);i++)
                                      charClient[nn+i]=buf[i];
                                      maBr.writen(sockfd, charClient, MAXLINE);
                     
                     char one_to_one[MAXLINE]="from client1";
                                         for(int i=0;i<strlen(one_to_one);i++)
                                      one_to_one[nn+i]=buf[i];
                     maBr.writen(sockfd+1, charClient, MAXLINE);
                     cout<<"from client: ";
                     fputs(buf,stdout);
                   
                    }

                if (--nready <= 0)
                    break;                /* no more readable descriptors */
            }
        }
    }
  }
  

mercredi 30 novembre 2005 à 14:29:34 | Re : Client/Serveur Linux

juki_webmaster

Membre Club
Salut, Tu doit gerer une fil d'attente pour gerer un nombre maximum de connecté simultanement ? -> struct struct_client { int numero; struct sockaddr_in client_csin; char ip[12]; int sock; }; struct struct_client *s_client[MAX_CLIENT]; int prochain_client=0; int main(int argc, char *argv[]) { // ... while(1) { if(prochain_client==(MAX_CLIENT+1)) { printf("Nombre de clients maximal atteint, recherche des places libres\n"); for(i=0;i<=MAX_CLIENT;i++) { if(s_client[i]==NULL) { printf("La place %d est libre\n",i); prochain_client=i; break; } } } else { // ont accepte la connexion.. // si bon: s_client[prochain_client]->numero = prochain_client; // ici tu lance ce que tu desire prochain_client++; } } } et a la coupure de la socket/fin de processus: s_client[num] = NULL;


Cette discussion est classée dans : client, include, fd, sockfd, allset


Répondre à ce message

Sujets en rapport avec ce message

PLEASE REPONDEZ MOI ! ! ! [ par marelo87 ] bonjour, voila je suis en train de programmer ma premiere appli reseau (tte simple)....mais pour me compliquer un peu la tache je voulais faire en sor FD_READ [ par argali ] Bonjour,J'ai un probleme avec FD_READ qui n'est pas appele lorsque mon client envoie un message au serveur, FD_WRITE marche par contre et le serveur p Récupérer valeur d'une ComboBox avec GetCurSel() et GetLBText() (ERREUR C2228) [ par freepouy18 ] Bonjour a tous, j'ai un problème avec une combobox, je desire récupérer la valeur sélectionnée pour faire un traitement particulier, voici le code :#i client serveur [ par elanspeech ] Bonjour,Je suis en train de programmer un petit client serveur en C pour windows avec dev-c++. J'obtiens l'erreur suivante a la compilation : D:\DEV-C Probleme avec les sockets [ par Scooper ] Bonjour a tous, j'ai un soucis avec l'utilisation des sockets sous UNIX AIX v3.25.J'ai 2 programmes : 1 client et 1 serveur.Ces 2 programmes fonctionn P2P avec WSAasyncselect [ par JoebarGlut ] Salut,je suis en train de realiser un petit systeme p2p et pour ca j'ai un serveur dedié DS, un client C1 et un client C2 qui ont le meme code.C1 et C Problème serveur TCP en C [ par lenneth666 ] BOnjour j'ai un petit problème. Je voulais faire en sorte que mon serveur puisse gérer la réception et l'envoi de message en parralèle, mais celà ne Bataille Navale en réseau avec Thread [ par lillie69 ] Bonjour,je dois programmer une bataille navale en réseau en utilisant des threads(sous Unix)!J'ai crée les fonctions de ma bataille navale ainsi que m Client serveur [ par fanch314 ] Je que le serveur et le client échange par internet.Le serveur ne voit pas de client connectéEt le buffer du client contient nimporte quoi.En gros ils boucle infinie et file de message [ par kyfranBibax ] Bonjour,j'ai un petit problème avec des files de messages et une boucle infinie.J'ai crée 2 programmes (un serveur et un cllient) qui communiquent via


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,544 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales