summaryrefslogtreecommitdiff
path: root/src/serversocket.cpp
diff options
context:
space:
mode:
authorDavid <david@xagasoft.com>2008-10-27 16:07:50 +0000
committerDavid <david@xagasoft.com>2008-10-27 16:07:50 +0000
commit61edfe804eb1a1dbf96fcdf2f1b700ed1cfa7ff9 (patch)
tree530a0d86ca1043dbc04cd7513bc5dd65768a266d /src/serversocket.cpp
parentf7e8658f2274044bb452492b1af7e2cd5f82082c (diff)
downloadlibbu++-61edfe804eb1a1dbf96fcdf2f1b700ed1cfa7ff9.tar.gz
libbu++-61edfe804eb1a1dbf96fcdf2f1b700ed1cfa7ff9.tar.bz2
libbu++-61edfe804eb1a1dbf96fcdf2f1b700ed1cfa7ff9.tar.xz
libbu++-61edfe804eb1a1dbf96fcdf2f1b700ed1cfa7ff9.zip
david - apparently windows prefers to dynamically load winsock and a couple other libraries, so I got it all compiling and working in windows, yay!... I tried to minimize the impact on the code: I made a DYNLOAD macro that evaluates to nothing on everything else, but runs the dynamic code if compiled for windows... also, apparently I had been randomly switching between ifdef and ifndef WIN32: so i made most of them ifdefs so it was less confusing...
Diffstat (limited to 'src/serversocket.cpp')
-rw-r--r--src/serversocket.cpp47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/serversocket.cpp b/src/serversocket.cpp
index 5ed661e..1908a8a 100644
--- a/src/serversocket.cpp
+++ b/src/serversocket.cpp
@@ -35,11 +35,11 @@ Bu::ServerSocket::ServerSocket( int nPort, int nPoolSize ) :
35 35
36 /* Give the socket a name. */ 36 /* Give the socket a name. */
37 name.sin_family = AF_INET; 37 name.sin_family = AF_INET;
38 name.sin_port = htons( nPort ); 38 name.sin_port = DYNLOAD htons( nPort );
39 39
40 // I think this specifies who we will accept connections from, 40 // I think this specifies who we will accept connections from,
41 // a good thing to make configurable later on 41 // a good thing to make configurable later on
42 name.sin_addr.s_addr = htonl( INADDR_ANY ); 42 name.sin_addr.s_addr = DYNLOAD htonl( INADDR_ANY );
43 43
44 startServer( name, nPoolSize ); 44 startServer( name, nPoolSize );
45} 45}
@@ -52,10 +52,11 @@ Bu::ServerSocket::ServerSocket(const FString &sAddr,int nPort, int nPoolSize) :
52 52
53 /* Give the socket a name. */ 53 /* Give the socket a name. */
54 name.sin_family = AF_INET; 54 name.sin_family = AF_INET;
55 name.sin_port = htons( nPort ); 55
56 name.sin_port = DYNLOAD htons( nPort );
56 57
57#ifdef WIN32 58#ifdef WIN32
58 name.sin_addr.s_addr = inet_addr( sAddr.getStr() ); 59 name.sin_addr.s_addr = DYNLOAD inet_addr( sAddr.getStr() );
59#else 60#else
60 inet_aton( sAddr.getStr(), &name.sin_addr ); 61 inet_aton( sAddr.getStr(), &name.sin_addr );
61#endif 62#endif
@@ -70,27 +71,29 @@ Bu::ServerSocket::~ServerSocket()
70void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) 71void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize )
71{ 72{
72 /* Create the socket. */ 73 /* Create the socket. */
73 nServer = socket( PF_INET, SOCK_STREAM, 0 ); 74 nServer = DYNLOAD socket( PF_INET, SOCK_STREAM, 0 );
75
74 if( nServer < 0 ) 76 if( nServer < 0 )
75 { 77 {
76 throw Bu::ServerSocketException("Couldn't create a listen socket."); 78 throw Bu::ServerSocketException("Couldn't create a listen socket.");
77 } 79 }
78 80
79 int opt = 1; 81 int opt = 1;
80 setsockopt( 82 DYNLOAD setsockopt(
81 nServer, 83 nServer,
82 SOL_SOCKET, 84 SOL_SOCKET,
83 SO_REUSEADDR, 85 SO_REUSEADDR,
84 (char *)&opt, 86 (char *)&opt,
85 sizeof( opt ) 87 sizeof( opt )
86 ); 88 );
87 89
88 if( bind( nServer, (struct sockaddr *) &name, sizeof(name) ) < 0 ) 90 if( DYNLOAD bind(
91 nServer, (struct sockaddr *) &name, sizeof(name) ) < 0 )
89 { 92 {
90 throw Bu::ServerSocketException("Couldn't bind to the listen socket."); 93 throw Bu::ServerSocketException("Couldn't bind to the listen socket.");
91 } 94 }
92 95
93 if( listen( nServer, nPoolSize ) < 0 ) 96 if( DYNLOAD listen( nServer, nPoolSize ) < 0 )
94 { 97 {
95 throw Bu::ServerSocketException( 98 throw Bu::ServerSocketException(
96 "Couldn't begin listening to the server socket." 99 "Couldn't begin listening to the server socket."
@@ -116,20 +119,29 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec )
116 xT.tv_sec = nTimeoutSec; 119 xT.tv_sec = nTimeoutSec;
117 xT.tv_usec = nTimeoutUSec; 120 xT.tv_usec = nTimeoutUSec;
118 121
119 if( TEMP_FAILURE_RETRY(select( nServer+1, &fdRead, NULL, NULL, &xT )) < 0 ) 122 if( TEMP_FAILURE_RETRY(
123 DYNLOAD select( nServer+1, &fdRead, NULL, NULL, &xT )) < 0 )
120 { 124 {
121 throw Bu::ServerSocketException( 125 throw Bu::ServerSocketException(
122 "Error scanning for new connections: %s", strerror( errno ) 126 "Error scanning for new connections: %s", strerror( errno )
123 ); 127 );
124 } 128 }
125 129
130#ifdef WIN32
131 if( DynamicWinsock2::DYN_FD_ISSET( nServer, &fdRead ) )
132#else
126 if( FD_ISSET( nServer, &fdRead ) ) 133 if( FD_ISSET( nServer, &fdRead ) )
134#endif
127 { 135 {
128 struct sockaddr_in clientname; 136 struct sockaddr_in clientname;
129 socklen_t size; 137 socklen_t size;
130 int nClient; 138 int nClient;
131 139
132 size = sizeof( clientname ); 140 size = sizeof( clientname );
141#ifdef WIN32
142 nClient = DYNLOAD accept(
143 nServer, (struct sockaddr *)&clientname, (int *)&size);
144#else /* not-WIN32 */
133#ifdef __CYGWIN__ 145#ifdef __CYGWIN__
134 nClient = ::accept( nServer, (struct sockaddr *)&clientname, 146 nClient = ::accept( nServer, (struct sockaddr *)&clientname,
135 (int *)&size 147 (int *)&size
@@ -141,6 +153,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec )
141 nClient = ::accept( nServer, (struct sockaddr *)&clientname, &size ); 153 nClient = ::accept( nServer, (struct sockaddr *)&clientname, &size );
142#endif /* __APPLE__ */ 154#endif /* __APPLE__ */
143#endif /* __CYGWIN__ */ 155#endif /* __CYGWIN__ */
156#endif /* WIN32 */
144 if( nClient < 0 ) 157 if( nClient < 0 )
145 { 158 {
146 throw Bu::ServerSocketException( 159 throw Bu::ServerSocketException(
@@ -175,7 +188,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec )
175 // If iMode = 0, blocking is enabled; 188 // If iMode = 0, blocking is enabled;
176 // If iMode != 0, non-blocking mode is enabled. 189 // If iMode != 0, non-blocking mode is enabled.
177 u_long iMode = 1; 190 u_long iMode = 1;
178 ioctlsocket(nClient, FIONBIO, &iMode); 191 DYNLOAD ioctlsocket(nClient, FIONBIO, &iMode);
179#endif 192#endif
180 } 193 }
181 194