next up previous contents
Next: Példa egy összeköttetés-mentes Up: Példák a socket Previous: Példa egy select-et

Példa egy konkurrens összeköttetés-alapú szerverre

A következo program lefoglalja az 5678-as TCP portot, kiírja annak a sorszámát a képernyore (vagyis az 5678-at), és végtelen ciklusban vár azon a TCP-porton egy kapcsolatra. Ha egy kliens rá akar kapcsolódni, akkor elfogadja a rákapcsolódási kérelmet, majd szül egy gyermek-folyamatot, amely a szokásos (korábban is látott) "szolgáltatást" elvégzi.

A SIGCLD signalt a program ignorálja, így a meghalt gyermek-folyamatok nem "halmozódnak fel" zombi-proceszek formájában.

/* 
 * Pelda arra, hogy hogyan mukodik egy (konkurrens) szerver.
 * A program vegtelen ciklusban figyel egy adott TCP portot, beolvassa
 * es a kepernyore irja az onnan jovo byteokat, majd uj kapcsolatra
 * var.
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <signal.h>
#define TRUE 1

main()
{
        int sock, length;
        struct sockaddr_in server;
        int msgsock;
        char buf[1024];
        int retval;
        int i;

        signal(SIGCLD,SIG_IGN);
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock < 0) {
                perror("hiba a socket-nel");
                exit(1);
        }
        server.sin_family = AF_INET;   
        server.sin_addr.s_addr = htonl(INADDR_ANY);
        server.sin_port = htons(5678);
        if (bind(sock, &server, sizeof(server))) {
                perror("hiba a bind-nel");
                exit(1);
        }
        length = sizeof(server);
        if (getsockname(sock, &server, &length)) { 
                perror("hiba a getsockname-nel");
                exit(1);
        }
        fprintf(stderr,"TCP port:%d\n", ntohs(server.sin_port)); 

        listen(sock, 5);
        do {
                msgsock = accept(sock, 0, 0);   
                if (msgsock == -1)
                        perror("hiba az accept-nel");
                else
                {
                  if (fork() == 0)
                  { /* Gyermek processz */
                    close(sock);
                    do {
                        bzero(buf, sizeof(buf));
                        if ((retval = read(msgsock, buf, 1024)) < 0)
                                perror("hiba a read-nel");
                        i = 0;
                        if (retval == 0)
                                fprintf(stderr,"Kapcsolat lezarva\n");
                        else
                                fprintf(stderr,"String:%s\n", buf);
                    } while (retval != 0);
                    close(msgsock); 
                    exit(0);
                  }
                  else
                  {
                    close(msgsock);
                  }
                }
        } while (TRUE);
        close(sock); /* Sosem sullyedunk idaig */  
}



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996