2010-08-09 8 views
1

Comment mon client peut-il envoyer deux requêtes (sur deux terminaux différents) au serveur en même temps? Quand je l'essaie, un seul fonctionne, l'autre ferme la douille.C Programmation de socket, 2 requêtes client en même temps

main () 
    { 

    readData(); 
    int serverFd, clientFd, clientFd2,serverLen, clientLen; 
    struct sockaddr_un serverAddress;/* Server address */ 
    struct sockaddr_un clientAddress; /* Client address */ 
    struct sockaddr* serverSockAddrPtr; /* Ptr to server address */ 
    struct sockaddr* clientSockAddrPtr; /* Ptr to client address */ 

    /* Ignore death-of-child signals to prevent zombies */ 
    signal (SIGCHLD, SIG_IGN); 

    serverSockAddrPtr = (struct sockaddr*) &serverAddress; 
    serverLen = sizeof (serverAddress); 

    clientSockAddrPtr = (struct sockaddr*) &clientAddress; 
    clientLen = sizeof (clientAddress); 

    /* Create a socket, bidirectional, default protocol */ 
    serverFd = socket (AF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL); 
    serverAddress.sun_family = AF_LOCAL; /* Set domain type */ 
    strcpy (serverAddress.sun_path, "countries"); /* Set name */ 
    unlink ("countries"); /* Remove file if it already exists */ 
    bind (serverFd, serverSockAddrPtr, serverLen); /* Create file */ 
    listen (serverFd, 5); /* Maximum pending connection length */ 

    while (1) /* Loop forever */ 
     { 
     /* Accept a client connection */ 
     clientFd = accept (serverFd, clientSockAddrPtr, &clientLen); 


     while (fork() == 0) /* Create child to send recipe */ 
      { 
int recvquery; 
char countrynamereceivedquery[200]; 
while (recvquery=read(clientFd,countrynamereceivedquery,sizeof(countrynamereceivedquery))) 
{ 
//print results 

} 
} 

Ceci est mon programme serveur. Je l'exécute comme un processus d'arrière-plan, puis exécute le programme client qui peut rechercher le fichier texte stocké dans un tableau dans le serveur. À l'heure actuelle, lorsque j'ouvre deux terminaux et que je lance le client en même temps, un client quitte le programme, l'autre client reçoit la requête du jus-quit-client et effectue une recherche sur le serveur. J'ai créé deux sockets mais le client se ferme dans les deux terminaux.

+0

Utilisez-vous une ou deux prises séparées? –

+0

Parlons-nous des sockets TCP? –

+0

Juste une prise. – svenus

Répondre

0

En supposant que le serveur autorise plusieurs connexions à la fois, vous pouvez créer un socket différent et l'utiliser pour ouvrir une autre connexion au serveur.

+0

Mon serveur crée simplement un socket et attend la demande de connexion des clients. Comment peut-il permettre plus d'une connexion? – svenus

+0

Après le retour du serveur, vous pouvez exécuter à nouveau appel pour accepter une autre connexion. – smichak

+0

Voici un exemple pour un serveur qui accepte plusieurs connexions et gère chaque connexion sur un thread distinct: http://www.cs.cf.ac.uk/Dave/C/node32.html#SECTION003270000000000000000 – smichak

0
  1. Vous utilisez la prise de fonction() pour créer une socket TCP.

  2. Vous affectez un numéro de port avec bind() au socket. En utilisant listen(), le système permet les connexions à ce port.

  3. Répéter les éléments suivants:

    a. accept() obtient un nouveau socket pour chaque client connecté.

    b. Avec send() et recv() vous communiquez avec le client via cette nouvelle socket.

    c. Enfin, vous fermez la connexion client avec la fonction close().