next up previous contents
Next: Példa egy konkurrens Up: Példák a socket Previous: Példa egy összeköttetés-alapú

Példa egy select-et használó összeköttetés-alapú szerverre

A következo program lefoglal egy TCP portot, kiírja annak a címét a képernyore, és végtelen ciklusban vár a TCP-porton egy kapcsolatra, és kiszolgálja a rákapcsolódott klienst (a szolgálat annyi, hogy a kliens által elküldött byteokat a szabványos kimenetre kiírja). Ha egy megadott idon belül nem érkezik egy klienstol sem rákapcsolódási igény, akkor megfelelo hibaüzenetet ír ki, és elorol kezdi az egészet.

/*
 * Ez egy egyszeru szerver, amely var egy kliens rakapcsoladasara, de
 * egy timeout erteket is definial, es ha azon az idon belul nem    
 * kapcsolodik ra egy kliens sem, akkor azt eszreveszi es fut tovabb.
 */

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

main()
{
        int sock, length;
        struct sockaddr_in server; /* Internet domain-beli cim */
        int msgsock; /* Erre a socket-descriptorra accept-alja 
                        a kapcsolatot */
        char buf[1024];
        int retval;
        fd_set ready;
        struct timeval to; /* timeout erteke */

        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(0);
        if (bind(sock, &server, sizeof(server))) {
                perror("hiba a bind-nal");
                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));

        /* Kliensekre var */
        listen(sock, 5);
        while(1) {
                FD_ZERO(&ready); /* \"ures halmazt hoz l\'etre */
                FD_SET(sock, &ready); /*sock socketot figyelni kell */
                to.tv_sec = 5; /* Timeout   */
                to.tv_usec=0; /* Microsec. */
                if (select(sock + 1, &ready, NULL, NULL, &to) < 0) {
                        perror("hiba a select-nel");
                        continue;
                }
                if (FD_ISSET(sock, &ready)) {  /* Be van allitva? */
                        msgsock=accept(sock,(struct sockaddr *)0,
                                       (int *)0);
                        if (msgsock == -1)
                                perror("hiba az accept-nel");
                        else do {
                                bzero(buf, sizeof(buf));
                                if ((retval=read(msgsock,buf,1024))<0)
                                        perror("hiba a read-nel");
                                else if (retval == 0)
                                        fprintf(stderr,"End...\n");
                                else
                                        fprintf(stderr,"%s\n", buf);
                        } while (retval > 0);
                        close(msgsock);  
                } else
                        fprintf(stderr,"Nincs kapcsolat ... \n");
        };
        close(sock); /* Idaig nem sullyedhetunk */
}



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