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

Revision 151, 7.2 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
3int main(int argc, char ** argv)
4{
5        /* variables to parse arguments */
6        extern int optind,
7                           optopt;
8        extern char * optarg;
9        char * log_file;
10        int c           = (int)NULL,
11                errflg  = (int)NULL,
12                verbose = (int)NULL;
13
14        /* fd -> file descriptor */
15        int socket_server_fd    = (int)NULL,
16                socket_server_port      = (int)NULL,
17                socket_accept_fd        = (int)NULL,
18                sockaddr_in_size        = sizeof(struct sockaddr_in),
19                err                                     = (int)NULL;
20
21        /* Internet socket address stuct */
22        struct sockaddr_in server_addr,
23                                           accept_addr;
24
25        struct client * clients = (struct client *) NULL,
26                                  * current = (struct client *) NULL;
27
28        pthread_t threads;
29
30        /* clear screen */
31        system(__CLEAR_SCREEN__);
32
33        while ( (c = getopt(argc, argv, ":vp:")) != -1 )
34        {
35                switch ( c )
36                {
37                        case 'p':
38                                if ( socket_server_port = strtol(optarg, 0, 10) == 0 )
39                                {
40                                        fprintf(stderr, "Option -%c requires a valid port and '%s' isn't valid\n", optopt, optarg);
41                                        ++errflg;
42                                }
43                                break;
44                        case 'v':
45                                verbose = 1;
46                                break;
47                        case ':':
48                                /* -f or -o without operand */
49                                fprintf(stderr, "Option -%c requires an operand\n", optopt);
50                                ++errflg;
51                                break;
52                        case '?':
53                                fprintf(stderr, "Unrecognized option: -%c\n", optopt);
54                                ++errflg;
55                }
56        }
57        if ( errflg )
58        {
59                fprintf(stderr, "usage: . . . \n\n");
60                exit(2);
61        }
62        //exit(0);
63
64        /*if ( argc != 2 || (socket_server_port = strtol(argv[1], 0, 10)) == 0 )
65                usage();*/
66
67        /* make a socket */
68        socket_server_fd = socket(AF_INET, SOCK_STREAM, 0);
69        if ( socket_server_fd == __SOCKET_ERROR__ )
70        {
71                printf("\nCould not make a socket\n");
72                return 0;
73        }
74
75        bzero((char *) &server_addr, sockaddr_in_size);
76        bzero((char *) &accept_addr, sockaddr_in_size);
77
78        if ( !socket_server_port )
79                socket_server_port = __DEFAULT_OPEN_PORT__;
80
81        /* fill address struct */
82        server_addr.sin_addr.s_addr     = INADDR_ANY;
83        server_addr.sin_port            = htons(socket_server_port);
84        server_addr.sin_family          = AF_INET;
85        bzero(&(server_addr.sin_zero), 8);
86
87        if ( __DEBUG__  || verbose )
88                printf("\nBinding to port %d...\n", socket_server_port);
89
90        /* bind to a port */
91        if ( bind(socket_server_fd, (struct sockaddr *)&(server_addr), sizeof(server_addr)) == __SOCKET_ERROR__ )
92        {
93                printf("\nCould not connect to host\n");
94                exit(1);
95        }
96
97        /* get port number */
98        getsockname(socket_server_fd, (struct sockaddr *)&(server_addr), (socklen_t *) &(sockaddr_in_size));
99        if ( __DEBUG__  || verbose )
100        {
101                printf("\nopened socket as fd (%d) on port (%d) for stream i/o\n", socket_server_fd, ntohs(server_addr.sin_port));
102
103                printf("Server\n\
104                                sin_family        = %d\n\
105                                sin_addr.s_addr   = %d\n\
106                                sin_port          = %d\n"
107                                , server_addr.sin_family
108                                , server_addr.sin_addr.s_addr
109                                , ntohs(server_addr.sin_port)
110                          );
111                printf("\nMaking a listen queue of %d elements", __QUEUE_SIZE__);
112        }
113
114        /* establish listen queue */
115        if ( listen(socket_server_fd, __QUEUE_SIZE__) == __SOCKET_ERROR__ )
116        {
117                printf("\nCould not listen\n");
118                return 0;
119        }
120
121        for ( ; ; )
122        {
123                if ( __DEBUG__  || verbose )
124                        puts("\nWaiting for a connection\n");
125
126                /* get the connected socket */
127                socket_accept_fd = accept(socket_server_fd, (struct sockaddr *) &(accept_addr), (socklen_t *) &(sockaddr_in_size));
128                fcntl(socket_accept_fd, F_SETFL, fcntl(socket_accept_fd, F_GETFL, 0) | O_NDELAY);
129
130                if ( socket_accept_fd > -1 )
131                {
132                        if ( clients == (struct client *) NULL )
133                                current = clients;
134                        else
135                                while ( (current = clients->next) != (struct client *) NULL );
136
137                        current                         = (struct client *) malloc(sizeof(struct client));
138                        current->next           = (struct client *) NULL;
139                        current->fd                     = socket_accept_fd;
140                        current->sockaddr       = accept_addr;
141                        current->last           = time(NULL);
142
143                        pthread_create(&(threads), NULL, handler, (void *) current);
144                }
145                puts("jah era #5");
146        }
147        pthread_exit(NULL);
148}
149
150void * handler(void * pClient)
151{
152    char pBuffer[__BUFFER_SIZE__];
153    struct client * client = (struct client *) pClient;
154    int i = 0, err;
155        time_t last;
156
157        char ip[46];
158        unsigned short port;
159        inet_ntop(AF_INET, &(client->sockaddr.sin_addr), ip, sizeof (ip));
160        port = ntohs(client->sockaddr.sin_port);
161        printf("\nGot a connection from %s, port %hu\n", ip, port);
162        //fcntl( client->fd, F_SETFL, fcntl( client->fd, F_GETFL ) & ~O_NONBLOCK );
163        //printf(":::client %d\n\n\n", fcntl( client->fd, F_GETFL, 0));
164        //printf(":::client %d\n\n\n", fcntl( client->fd, F_SETFL, fcntl( client->fd, F_GETFL ) & ~O_NONBLOCK ));
165        /*---------------------------------------------------*/
166
167        int jabber_fd           = (int)NULL,
168                jabber_port             = (int)NULL,
169                jabber_error    = (int)NULL;
170
171        struct sockaddr_in jabber_addr;
172
173        jabber_port = __DEFAULT_JABBER_PORT__;
174        //jabber_port = strtol(__DEFAULT_JABBER_PORT__, 0, 10);
175        jabber_fd = socket(AF_INET, SOCK_STREAM, 0);
176        fcntl(jabber_fd, F_SETFL, fcntl(jabber_fd, F_GETFL, 0) | O_NDELAY);
177
178        jabber_addr.sin_family = AF_INET;
179        inet_aton(__DEFAULT_JABBER_IP__, &jabber_addr.sin_addr);
180        jabber_addr.sin_port = htons(jabber_port);
181
182        jabber_error = connect(jabber_fd, (struct sockaddr *) &(jabber_addr), sizeof(jabber_addr));
183
184        last = time(NULL);
185        //while ( (time(NULL) - last) < 60 )
186        //{
187                /* read from client */
188        //      read(client->fd, pBuffer, __BUFFER_SIZE__);
189        //      printf("\n\n--------\n\nread from client:\n%s\n\n------------\n\n", pBuffer);
190                /* write in the jabber service */
191        //      write(jabber_fd, pBuffer, strlen(pBuffer));
192        //      sleep(1);
193                /* read from jabber service */
194        //      read(jabber_fd, pBuffer, __BUFFER_SIZE__);
195        //      printf("\n\n--------\n\nread from jabber:\n%s\n\n------------\n\n", pBuffer);
196                /* write in the client */
197        //      write(client->fd, pBuffer, strlen(pBuffer));
198        //}
199
200        int optval = 1;
201        socklen_t optlen = sizeof(optval);
202        if ( setsockopt(client->fd, SOL_SOCKET, SO_KEEPALIVE, &(optval), optlen ) )
203        {
204                puts("asdgsdfgsdfg");
205                exit(1);
206        }
207
208        int retval, ttlval, rbuf, len;
209        while ( (time(NULL) - last) < 20 )
210        {
211                printf("\n\n#################\n%d\n", getsockopt(client->fd, SOL_SOCKET, SO_KEEPALIVE, &optval, NULL));
212                printf("%d\n#######################\n\n", optval );
213                bzero(pBuffer, __BUFFER_SIZE__);
214                /* read from client */
215                printf("\n\n--------\nread from client...\n");
216                printf("error: %d\n", read(client->fd, pBuffer, __BUFFER_SIZE__));
217                printf("read from client:\n%s\n\n------------\n\n", pBuffer);
218
219                /* write in the jabber service */
220                printf("write in the jabber...\n");
221                //write(jabber_fd, pBuffer, strlen(pBuffer));
222                printf("send to jabber %d", sendto(jabber_fd, pBuffer, strlen(pBuffer), MSG_CONFIRM, 0,0));
223
224                //while ( (time(NULL) - last) < 5 );
225
226                bzero(pBuffer, __BUFFER_SIZE__);
227                /* read from jabber service */
228                printf("\n\n--------\nread from jabber...\n");
229                printf("error: %d\n", read(jabber_fd, pBuffer, __BUFFER_SIZE__));
230                printf("read from jabber:\n%s\n\n------------\n\n", pBuffer);
231
232                /* write in the client */
233                printf("write in the client...\n");
234                write(client->fd, pBuffer, strlen(pBuffer));
235
236                //printf("buffer limpo: %s\n\n----------------\n\n", pBuffer);
237                sleep(1);
238        }
239
240    if ( close(jabber_fd) == __SOCKET_ERROR__ )
241    {
242        printf("\nCould not close jabber socket\n");
243        return 0;
244    }
245        /*---------------------------------------------------*/
246    if ( close(client->fd) == __SOCKET_ERROR__ )
247    {
248        printf("\nCould not close socket\n");
249        return 0;
250    }
251
252    fflush(stdin);
253    fflush(stdout);
254        free(client);
255    pthread_exit(NULL);
256}
Note: See TracBrowser for help on using the repository browser.