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 */
}