6 #ifdef _WIN32 /* Windows */
13 #include <netinet/ip.h>
14 #include <netinet/tcp.h>
15 #include <sys/select.h>
25 #ifdef _WIN32 /* Windows */
26 typedef SOCKET socket_t
;
34 #define BUFFER_SIZE 4096
35 #define TIMEOUT 100000
39 #ifdef _WIN32 /* Windows */
40 #define PF_INET AF_INET
41 #define ERRNO (WSAGetLastError ())
43 #define closesocket close
45 #define SOCKET_ERROR -1
46 #define INVALID_SOCKET -1
51 socket_t sock
= INVALID_SOCKET
;
52 socket_t conn
= INVALID_SOCKET
;
56 void stop_server (int sig
)
58 VERBOSE (INFO
, PRINT ("Signal: %d\n", sig
));
59 terminate_network_context ();
63 /* init network context */
65 void init_network_context (void)
67 #ifdef _WIN32 /* Windows */
69 WSAStartup (MAKEWORD(2,0), &WSAData
);
71 assert (INVALID_SOCKET
== (socket_t
)-1);
72 assert (SOCKET_ERROR
== -1);
75 signal (SIGINT
, &stop_server
);
76 signal (SIGQUIT
, &stop_server
);
77 signal (SIGABRT
, &stop_server
);
78 signal (SIGSEGV
, &stop_server
);
79 signal (SIGTERM
, &stop_server
);
82 /* terminate network context */
84 void terminate_network_context (void)
88 #ifdef _WIN32 /* Windows */
93 /* open listening socket */
95 int open_listening_socket (int port
)
99 VERBOSE (DEBUG
, PRINT ("Opening socket\n"));
100 //socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
101 if (sock
!= INVALID_SOCKET
) {
102 int rc
= closesocket (sock
);
103 if (rc
== SOCKET_ERROR
) {
104 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
106 sock
= INVALID_SOCKET
;
108 sock
= socket (AF_INET
, SOCK_STREAM
, 0);
109 if (sock
== INVALID_SOCKET
) {
113 struct sockaddr_in addr
= {0};
114 //bzero (&addr, sizeof (addr));
115 //addr.sin_family = PF_INET;
116 addr
.sin_family
= AF_INET
;
117 addr
.sin_port
= htons (port
);
118 addr
.sin_addr
.s_addr
= htonl (INADDR_ANY
);
120 VERBOSE (DEBUG
, PRINT ("Binding socket\n"));
121 //setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val));
122 int rc
= bind (sock
, (struct sockaddr
*)&addr
, sizeof (addr
));
123 if (rc
== SOCKET_ERROR
) {
124 VERBOSE (ERROR
, PERROR ("error: bind %d\n", ERRNO
));
125 rc
= closesocket (sock
);
126 if (rc
== SOCKET_ERROR
) {
127 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
129 sock
= INVALID_SOCKET
;
133 VERBOSE (DEBUG
, PRINT ("Configuring socket\n"));
134 #ifndef _WIN32 /* Posix */
135 fcntl (sock
, F_SETFL
, O_NONBLOCK
);
137 rc
= setsockopt (sock
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
139 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
141 if (rc
== SOCKET_ERROR
) {
142 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
144 sock
= INVALID_SOCKET
;
148 rc
= listen (sock
, BACKLOG
);
150 VERBOSE (ERROR
, PERROR ("error: %s\n", "listen"));
152 if (rc
== SOCKET_ERROR
) {
153 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
155 sock
= INVALID_SOCKET
;
162 /* accept incomming connection */
164 int accept_incoming_connection (void)
166 if (sock
== INVALID_SOCKET
) {
167 VERBOSE (ERROR
, PERROR ("Can't accept connection from closed socket\n"));
171 if (conn
!= INVALID_SOCKET
) {
172 int rc
= closesocket (conn
);
173 if (rc
== SOCKET_ERROR
) {
174 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
176 conn
= INVALID_SOCKET
;
178 conn
= accept (sock
, NULL
, 0);
179 if (conn
== INVALID_SOCKET
) {
183 #ifndef _WIN32 /* POSIX */
184 fcntl (conn
, F_SETFL
, O_NONBLOCK
);
187 int rc
= setsockopt (conn
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
189 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
191 if (rc
== SOCKET_ERROR
) {
192 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
194 conn
= INVALID_SOCKET
;
201 /* close connection socket */
203 void close_connection (void)
205 int rc
= closesocket (conn
);
206 if (rc
== SOCKET_ERROR
) {
207 VERBOSE (ERROR
, PERROR ("error: %d\n", ERRNO
));
209 conn
= INVALID_SOCKET
;
212 /* receive data from socket */
214 int receive_data (unsigned char **pdata
)
216 unsigned char buffer
[BUFFER_SIZE
] = {0};
217 unsigned char *data
= NULL
;
220 if (conn
== INVALID_SOCKET
) {
221 VERBOSE (ERROR
, PERROR ("Can't read data from closed socket\n"));
227 /* timeout management */
229 struct timeval tv
= { 0, TIMEOUT
};
231 FD_SET (conn
, &rfds
);
233 int retval
= select (conn
+ 1, &rfds
, NULL
, NULL
, &tv
);
234 if (retval
!= 1) { /* 0 or SOCKET_ERROR */
238 /* read from socket */
239 int rc
= read (conn
, buffer
, BUFFER_SIZE
);
241 if (rc
== 0) { /* sock closed */
249 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
258 data
= realloc (data
, len
+ rc
);
259 memcpy (data
+ len
, buffer
, rc
);
270 /* send data onto socket */
272 int send_data (unsigned char *data
, int len
)
276 if (conn
== INVALID_SOCKET
) {
277 VERBOSE (ERROR
, PERROR ("Can't read data from closed socket\n"));
281 while (index
< len
) {
282 int rc
= write (conn
, data
+ index
, len
- index
);
284 if (rc
== 0) { /* sock closed */
287 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
298 /* vim: set ts=4 sw=4 et: */