diff options
Diffstat (limited to 'tools/data_server/data_server.c')
-rw-r--r-- | tools/data_server/data_server.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/tools/data_server/data_server.c b/tools/data_server/data_server.c new file mode 100644 index 0000000..f602a63 --- /dev/null +++ b/tools/data_server/data_server.c @@ -0,0 +1,169 @@ +//Blatantly ripped off of https://www.cs.cmu.edu/afs/cs/academic/class/15213-f99/www/class26/tcpserver.c + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <netdb.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <os_generic.h> + +#define MAX_CONNS 32 + +int SocketList[MAX_CONNS]; + +void error(char *msg) { + perror(msg); + exit(1); +} + +void * SendThread( void * v ) +{ + while(1) + { + int i; + char buff[1024]; + int rd = read( STDIN_FILENO, buff, sizeof( buff ) ); + if( rd <= 0 ) + { + fprintf( stderr, "Error: Can't read data\n" ); + exit( -1 ); + } + for( i = 0; i < MAX_CONNS; i++ ) + { + int sockc = SocketList[i]; + if( sockc == 0 ) continue; + int ss = send( sockc, buff, rd, MSG_DONTWAIT | MSG_NOSIGNAL ); + if( ss < rd ) + { + fprintf( stderr, "Dropped %d\n", i ); + close( SocketList[i] ); + SocketList[i] = 0; + } + } + } +} + +int main( int argc, char ** argv ) +{ + int parentfd; /* parent socket */ + int childfd; /* child socket */ + int portno; /* port to listen on */ + int clientlen; /* byte size of client's address */ + struct sockaddr_in serveraddr; /* server's addr */ + struct sockaddr_in clientaddr; /* client addr */ + struct hostent *hostp; /* client host info */ + char *hostaddrp; /* dotted decimal host addr string */ + int optval; /* flag value for setsockopt */ + int n; /* message byte size */ + + if (argc != 2) { + fprintf(stderr, "usage: %s <port>\n", argv[0]); + exit(1); + } + portno = atoi(argv[1]); + + parentfd = socket(AF_INET, SOCK_STREAM, 0); + if (parentfd < 0) + error("ERROR opening socket"); + + + /* setsockopt: Handy debugging trick that lets + * us rerun the server immediately after we kill it; + * otherwise we have to wait about 20 secs. + * Eliminates "ERROR on binding: Address already in use" error. + */ + optval = 1; + setsockopt(parentfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)); + + + /* + * build the server's Internet address + */ + bzero((char *) &serveraddr, sizeof(serveraddr)); + + /* this is an Internet address */ + serveraddr.sin_family = AF_INET; + + /* let the system figure out our IP address */ + serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); + + /* this is the port we will listen on */ + serveraddr.sin_port = htons((unsigned short)portno); + + /* + * bind: associate the parent socket with a port + */ + if (bind(parentfd, (struct sockaddr *) &serveraddr, + sizeof(serveraddr)) < 0) + error("ERROR on binding"); + + /* + * listen: make this socket ready to accept connection requests + */ + if (listen(parentfd, 5) < 0) /* allow 5 requests to queue up */ + error("ERROR on listen"); + + /* + * main loop: wait for a connection request, echo input line, + * then close connection. + */ + clientlen = sizeof(clientaddr); + + OGCreateThread( SendThread, 0 ); + while (1) { + /* + * accept: wait for a connection request + */ + childfd = accept(parentfd, (struct sockaddr *) &clientaddr, &clientlen); + if (childfd < 0) + error("ERROR on accept"); + +// hostp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, +// sizeof(clientaddr.sin_addr.s_addr), AF_INET); +// if (hostp == NULL) +// error("ERROR on gethostbyaddr"); + hostaddrp = inet_ntoa(clientaddr.sin_addr); + //if (hostaddrp == NULL) + //error("ERROR on inet_ntoa\n"); + + + int il; + for( il = 0; il < MAX_CONNS; il++ ) + { + if( SocketList[il] == 0 ) + { + SocketList[il] = childfd; + printf("Conn %s At %d\n", + hostaddrp, il); + break; + } + } + if( il == MAX_CONNS ) + { + close( childfd ); + } + + /* + * read: read input string from the client + */ +/* bzero(buf, BUFSIZE); + n = read(childfd, buf, BUFSIZE); + if (n < 0) + error("ERROR reading from socket"); + printf("server received %d bytes: %s", n, buf); +*/ + /* + * write: echo the input string back to the client + */ +/* n = write(childfd, buf, strlen(buf)); + if (n < 0) + error("ERROR writing to socket"); + + close(childfd);*/ + } +} + |