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 #ifndef _WIN32 /* Posix */
76 signal (SIGINT
, &stop_server
);
78 signal (SIGABRT
, &stop_server
);
79 signal (SIGSEGV
, &stop_server
);
80 signal (SIGTERM
, &stop_server
);
83 /* terminate network context */
85 void _closesocket (socket_t sock
)
87 if (sock
!= INVALID_SOCKET
) {
88 int rc
= closesocket (sock
);
89 if (rc
== SOCKET_ERROR
) {
90 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
95 void terminate_network_context (void)
99 #ifdef _WIN32 /* Windows */
104 /* open listening socket */
106 int open_listening_socket (int port
)
110 VERBOSE (DEBUG
, PRINT ("Opening socket\n"));
111 //socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
113 sock
= socket (AF_INET
, SOCK_STREAM
, 0);
114 if (sock
== INVALID_SOCKET
) {
118 struct sockaddr_in addr
= {0};
119 //bzero (&addr, sizeof (addr));
120 //addr.sin_family = PF_INET;
121 addr
.sin_family
= AF_INET
;
122 addr
.sin_port
= htons (port
);
123 addr
.sin_addr
.s_addr
= htonl (INADDR_ANY
);
125 VERBOSE (DEBUG
, PRINT ("Binding socket\n"));
126 //setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val));
127 int rc
= bind (sock
, (struct sockaddr
*)&addr
, sizeof (addr
));
128 if (rc
== SOCKET_ERROR
) {
129 VERBOSE (ERROR
, PERROR ("error: bind %d\n", ERRNO
));
131 sock
= INVALID_SOCKET
;
135 VERBOSE (DEBUG
, PRINT ("Configuring socket\n"));
136 #ifndef _WIN32 /* Posix */
137 fcntl (sock
, F_SETFL
, O_NONBLOCK
);
139 rc
= setsockopt (sock
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
141 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
143 sock
= INVALID_SOCKET
;
147 rc
= listen (sock
, BACKLOG
);
149 VERBOSE (ERROR
, PERROR ("error: %s\n", "listen"));
151 sock
= INVALID_SOCKET
;
158 /* accept incomming connection */
160 int accept_incoming_connection (void)
162 if (sock
== INVALID_SOCKET
) {
163 VERBOSE (ERROR
, PERROR ("Can't accept connection from closed socket\n"));
167 if (conn
!= INVALID_SOCKET
) {
169 conn
= INVALID_SOCKET
;
171 conn
= accept (sock
, NULL
, 0);
172 if (conn
== INVALID_SOCKET
) {
176 #ifndef _WIN32 /* POSIX */
177 fcntl (conn
, F_SETFL
, O_NONBLOCK
);
180 int rc
= setsockopt (conn
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
182 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
184 conn
= INVALID_SOCKET
;
191 /* close connection socket */
193 void close_connection (void)
196 conn
= INVALID_SOCKET
;
199 /* receive data from socket */
201 int receive_data (char **pdata
)
203 char buffer
[BUFFER_SIZE
] = {0};
207 if (conn
== INVALID_SOCKET
) {
208 VERBOSE (ERROR
, PERROR ("Can't read data from closed socket\n"));
214 /* timeout management */
216 struct timeval tv
= { 0, TIMEOUT
};
218 FD_SET (conn
, &rfds
);
220 int retval
= select (conn
+ 1, &rfds
, NULL
, NULL
, &tv
);
221 if (retval
!= 1) { /* 0 or SOCKET_ERROR */
225 /* read from socket */
226 int rc
= recv (conn
, buffer
, BUFFER_SIZE
, 0);
227 VERBOSE (DEBUG
, PRINT ("rc: %d\nerrno: %d\n", rc
, ERRNO
));
229 if (rc
== 0) { /* sock closed or error */
234 len
= (rc
< 0) ? -1 : 0;
238 data
= realloc (data
, len
+ rc
);
239 memcpy (data
+ len
, buffer
, rc
);
250 /* send data onto socket */
252 int send_data (char *data
, int len
)
256 if (conn
== INVALID_SOCKET
) {
257 VERBOSE (ERROR
, PERROR ("Can't read data from closed socket\n"));
261 while (index
< len
) {
262 int rc
= send (conn
, data
+ index
, len
- index
, 0);
264 if (rc
<= 0) { /* sock closed or error */
265 index
= (rc
< 0) ? -1 : 0;
275 /* vim: set ts=4 sw=4 et: */