source: trunk/instant_messenger/socket/BKP_20071105/BKP_20071026/BKP_20071019/BKP_20071018/server_bkp_20071010.c @ 151

Revision 151, 2.6 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 "server.h"
2
3static void handle_request(int, struct sockaddr_in);
4
5int main(int argc, char ** argv)
6{
7        // fd -> file descriptor
8        int socket_server_fd    = (int)NULL,
9                socket_server_port  = (int)NULL,
10                socket_accept_fd    = (int)NULL,
11                sockaddr_in_size    = sizeof(struct sockaddr_in),
12                err                 = (int)NULL,
13                pid                                     = (int)NULL;
14
15        /* Internet socket address stuct */
16        struct sockaddr_in server_addr,
17                                           accept_addr;
18
19        bzero((char *) &server_addr, sockaddr_in_size);
20        bzero((char *) &accept_addr, sockaddr_in_size);
21
22        // make a socket
23        socket_server_fd = socket(AF_INET, SOCK_STREAM, 0);
24        if ( socket_server_fd == __SOCKET_ERROR__ )
25        {
26                fprintf(stderr, "\nCould not make a socket\n");
27                exit(EXIT_FAILURE);
28        }
29
30        // fill address struct
31        server_addr.sin_addr.s_addr = INADDR_ANY;
32        server_addr.sin_port        = htons(8888);
33        server_addr.sin_family      = AF_INET;
34        bzero(&(server_addr.sin_zero), 8);
35
36        // bind to a port
37        if ( bind(socket_server_fd, (struct sockaddr *)&(server_addr), sizeof(server_addr)) == __SOCKET_ERROR__ )
38        {
39                fprintf(stderr, "\nCould not connect to host\n");
40                exit(EXIT_FAILURE);
41        }
42
43        // get port number
44        getsockname(socket_server_fd, (struct sockaddr *)&(server_addr), (socklen_t *) &(sockaddr_in_size));
45        //if ( __DEBUG__  || verbose )
46        //{
47                printf("\nopened socket as fd (%d) on port (%d) for stream i/o\n", socket_server_fd, ntohs(server_addr.sin_port));
48
49                printf("Server\n\
50                                sin_family        = %d\n\
51                                sin_addr.s_addr   = %d\n\
52                                sin_port          = %d\n"
53                                , server_addr.sin_family
54                                , server_addr.sin_addr.s_addr
55                                , ntohs(server_addr.sin_port)
56                          );
57                printf("\nMaking a listen queue of %d elements", __QUEUE_SIZE__);
58        //}
59
60        // establish listen queue
61        if ( listen(socket_server_fd, __QUEUE_SIZE__) == __SOCKET_ERROR__ )
62        {
63                fprintf(stderr, "\nCould not listen\n");
64                exit(EXIT_FAILURE);
65        }
66
67        while ( 1 )
68        {
69                //if ( __DEBUG__  || verbose )
70                        puts("\nWaiting for a connection\n");
71
72                // get the connected socket
73                socket_accept_fd = accept(socket_server_fd, (struct sockaddr *) &(accept_addr), (socklen_t *) &(sockaddr_in_size));
74
75                if ( socket_accept_fd > -1 )
76                {
77                        pid = fork();
78                        if ( pid )
79                        {
80                                close(socket_accept_fd);
81                                continue;
82                        }
83                        else
84                        {
85                                close(socket_server_fd);
86                                handle_request(socket_accept_fd, accept_addr);
87                                close(socket_accept_fd);
88                        }
89                        //close(socket_accept_fd);
90                }
91        }
92}
93
94static void handle_request(int sock, struct sockaddr_in client_addr)
95{
96        char * buffer_client;
97
98        buffer_client = (char *) malloc(sizeof(char) * __BUFFER_SIZE__);
99        bzero(buffer_client, __BUFFER_SIZE__);
100
101        read(sock, buffer_client, __BUFFER_SIZE__);
102        printf("%s\n", buffer_client);
103
104        free(buffer_client);
105}
Note: See TracBrowser for help on using the repository browser.