source: lib/rtserver.c @ dd22d84

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since dd22d84 was 9456f1e, checked in by Daniel Lawson <dlawson@…>, 16 years ago

adding in the rtserver files that SHANE DIDN'T ADD IN

  • Property mode set to 100644
File size: 4.1 KB
Line 
1#include "rtserver.h"
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/socket.h>
5#include <time.h>
6#include <netdb.h>
7#include <netinet/in.h>
8#include <errno.h>
9
10
11/** Structure containing all the information necessary to run an rtserver */
12struct rtserver_t {
13        /** fd describing the listening socket */
14        int connect_fd;
15        /** set of client fds */
16        fd_set rt_fds;
17        /** the highest numbered fd */
18        int max_rtfds;
19        /** sockaddr used to accept incoming connections */
20        struct sockaddr_in * remote;
21};
22
23struct rtserver_t * rtserver_create (char * hostname, short port) {
24        struct rtserver_t * rtserver = malloc(sizeof(struct rtserver_t));
25        struct hostent *he;
26        int yes = 1;
27       
28        FD_ZERO(&rtserver->rt_fds);
29
30        if ((he=gethostbyname(hostname)) == NULL) {
31                perror("gethostbyname");
32                return 0;
33        }
34        if ((rtserver->connect_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
35                perror("socket");
36                return 0;
37        }
38        if (setsockopt(rtserver->connect_fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
39                perror("setsockopt");
40                return 0;
41        }
42        rtserver->remote = calloc(1,sizeof(struct sockaddr_in));
43        // Need to set up a listening server here
44        bzero((char *) rtserver->remote, sizeof(rtserver->remote));
45        rtserver->remote->sin_family = AF_INET;
46        rtserver->remote->sin_addr.s_addr = INADDR_ANY;
47        rtserver->remote->sin_port = htons(port);
48
49        if (bind(rtserver->connect_fd, (struct sockaddr *) rtserver->remote, sizeof(struct sockaddr_in)) < 0) {
50                perror("bind");
51                return 0;
52        }
53
54        if (listen(rtserver->connect_fd, 10) == -1) {
55                perror("listen");
56                return 0;
57        }
58
59        rtserver->max_rtfds = rtserver->connect_fd;
60
61        return rtserver;
62}
63
64void rtserver_destroy (struct rtserver_t * rtserver) {
65        int i;
66        close(rtserver->connect_fd);
67
68        for (i=1; i <= rtserver->max_rtfds; i++) {
69                if (FD_ISSET(i, &rtserver->rt_fds)) {
70                        close(i);
71                }
72        }
73       
74        free(rtserver->remote);
75        free(rtserver);
76}
77
78int rtserver_checklisten (struct rtserver_t * rtserver) {
79        struct timeval tv;
80        int rt_fd = 0;
81        fd_set current;
82        int i;
83        int sin_size = sizeof(struct sockaddr_in);
84       
85        tv.tv_sec = 0;
86        tv.tv_usec = 10;
87       
88        FD_ZERO(&current);
89        FD_SET(rtserver->connect_fd, &current);
90       
91        do {
92                if (select(rtserver->max_rtfds + 1, &current, NULL, NULL,&tv) >=0 ) {
93                        break;
94                }
95        }
96        while (errno == EINTR);
97        for (i = 0; i <= rtserver->max_rtfds; i++) {
98                if (FD_ISSET(i, &current)) {
99                        // Got something on the listening socket
100                        if (i == rtserver->connect_fd) {
101                                if ((rt_fd = accept(i, (struct sockaddr *) rtserver->remote,
102                                                                &sin_size)) == -1) {
103                                        perror("accept");
104                                        return -1;
105                                } else {
106                                        printf("Client connected\n");
107                                        FD_SET(rt_fd, &rtserver->rt_fds);
108                                        if (rt_fd > rtserver->max_rtfds)
109                                                rtserver->max_rtfds = rt_fd;
110                                }
111                        }
112                }
113        }
114        return rt_fd;
115}
116
117int rtserver_sendclients (struct rtserver_t * rtserver, char * buffer, size_t len) {
118        fd_set current;
119        int i;
120        int numbytes = 0;
121        struct timeval tv;
122       
123        tv.tv_sec = 0;
124        tv.tv_usec = 10;
125        current = rtserver->rt_fds;
126
127        if (select(rtserver->max_rtfds + 1, NULL, &current, NULL, &tv) == -1 ) {
128                perror("select");
129                return -1;
130               
131        }
132
133        // Send the data to each ready client
134        for (i = 0; i <= rtserver->max_rtfds; i++) {
135                if (FD_ISSET(i, &current)) {
136                       
137                        // do write
138#ifndef MSG_NOSIGNAL
139#define MSG_NOSIGNAL 0
140#endif
141
142                        if ((numbytes = send(i, buffer, len, MSG_NOSIGNAL)) == -1) {
143                                perror("send");
144                                FD_CLR(i, &rtserver->rt_fds);
145                                close(i);
146                                numbytes = 0;                               
147                        }
148                }
149        }
150        return numbytes;
151}
Note: See TracBrowser for help on using the repository browser.