source: trunk/instant_messenger/socket/BKP_20071105/BKP_20071026/BKP_20071019/BKP_20071018/BKP_20071009/BKP_20071008/BKP/BOOK/server.c @ 151

Revision 151, 1.8 KB checked in by niltonneto, 16 years ago (diff)

Commit da nova versão do módulo, usando agente em C.
Vide Página do módulo do Trac:
http://www.expressolivre.org/dev/wiki/messenger

A versão anterior encontra-se na subpasta bkp (32/64).

Line 
1#include "unp.h"
2
3int main(int argc, char ** argv)
4{
5        int maxfdp1,
6                listenfd,
7                connfd,
8                nready,
9                udpfd;
10        char mesg[MAXLINE];
11        pid_t childpid;
12        fd_set rset;
13        ssize_t n;
14        socklen_t clilen,
15                          len;
16        const int on = 1;
17        struct sockaddr_in cliaddr,
18                                           servaddr;
19        void sig_chld(int);
20
21        listenfd = Socket(AF_INET, SOCK_STREAM, 0); /* create listening TCP socket */
22
23        bzero(&servaddr, sizeof(servaddr));
24        servaddr.sin_family = AF_INET;
25        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
26        servaddr.sin_port = htons(SERV_PORT);
27
28        setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &(on), sizeof(on));
29        bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
30
31        Listen(listenfd, LISTENQ);
32
33        udpfd = Socket(AF_INET, SOCK_DGRAM, 0); /* create UDP socket */
34
35        bzero(&servaddr, sizeof(servaddr));
36        servaddr.sin_family = AF_INET;
37        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
38        servaddr.sin_port = htons(SERV_PORT);
39
40        bind(udpfd, (SA *)&servaddr, sizeof(servaddr));
41
42        signal(SIGCHLD, sig_chld);      /* must call waitpid() */
43
44        FD_ZERO(&(rset));
45        maxfdp1 = max(listenfd, udpfd) + 1;
46
47        for ( ; ; )
48        {
49                FD_SET(listenfd,&(rset));
50                FD_SET(udpfd,&(rset));
51
52                if ( (nready = select(maxfdp1, &(rset), NULL, NULL, NULL)) < 0 )
53                {
54                        if ( errno == EINTR )
55                                continue;       /* back to for() */
56                        else
57                                err_sys("select error");
58                }
59                if ( FD_ISSET(listenfd, &(rset)) )
60                {
61                        len = sizeof(cliaddr);
62                        connfd = accept(listenfd, (SA *) &(cliaddr), &(len));
63
64                        if ( childpid = fork() == 0 )   /* child process */
65                        {
66                                close(listenfd);                        /* close listening socket */
67                                str_echo(connfd);                       /* process request */
68                                exit(0);
69                        }
70                        close(connfd);                                  /* parent closes connected socket */
71                }
72                if ( FD_ISSET(udpfd, &(rset)) )
73                {
74                        len = sizeof(cliaddr);
75                        n = recvfrom(udpfd, mesg, MAXLINE, 0, (SA *) &(cliaddr), &(len));
76                        sendto(udpfd, mesg, n, 0, (SA *) &(cliaddr), len);
77                }
78
79        }
80
81        return 0;
82}
Note: See TracBrowser for help on using the repository browser.