8 #include "networktables2/stream/SocketServerStreamProvider.h"
9 #include "networktables2/stream/FDIOStream.h"
10 #include "networktables2/util/IOException.h"
17 #include <selectLib.h>
22 #include <netinet/in.h>
23 #include <netinet/tcp.h>
27 #include <sys/types.h>
36 #include <sys/socket.h>
38 #include <netinet/in.h>
39 #include <netinet/tcp.h>
47 #if defined(WIN32) || defined(_WRS_KERNEL)
48 typedef int addrlen_t;
50 typedef socklen_t addrlen_t;
54 SocketServerStreamProvider::SocketServerStreamProvider(
int port){
55 struct sockaddr_in serverAddr;
56 int sockAddrSize =
sizeof(serverAddr);
57 memset(&serverAddr, 0, sockAddrSize);
60 serverAddr.sin_len = (u_char)sockAddrSize;
62 serverAddr.sin_family = AF_INET;
63 serverAddr.sin_port = htons(port);
64 serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
66 if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == ERROR)
68 throw IOException(
"Error creating server socket", errno);
73 setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (
char *)&reuseAddr,
sizeof(reuseAddr));
76 if (bind(serverSocket, (
struct sockaddr *)&serverAddr, sockAddrSize) == ERROR)
79 throw IOException(
"Could not bind server socket", errno);
82 if (listen(serverSocket, 1) == ERROR)
85 throw IOException(
"Could not listen on server socket", errno);
88 SocketServerStreamProvider::~SocketServerStreamProvider(){
94 struct timeval timeout;
101 FD_SET(serverSocket, &fdSet);
104 int select_result = select(FD_SETSIZE, &fdSet, NULL, NULL, &timeout);
105 if ( select_result < 0)
108 if (FD_ISSET(serverSocket, &fdSet))
110 struct sockaddr clientAddr;
111 memset(&clientAddr, 0,
sizeof(
struct sockaddr));
112 addrlen_t clientAddrSize =
sizeof(clientAddr);
113 int connectedSocket =
::accept(serverSocket, &clientAddr, &clientAddrSize);
114 if (connectedSocket == ERROR)