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 socket_t _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
));
130 _closesocket (_sock
);
134 VERBOSE (DEBUG
, PRINT ("Configuring socket\n"));
135 #ifndef _WIN32 /* Posix */
136 fcntl (_sock
, F_SETFL
, O_NONBLOCK
);
138 rc
= setsockopt (_sock
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
140 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
141 _closesocket (_sock
);
145 rc
= listen (_sock
, BACKLOG
);
147 VERBOSE (ERROR
, PERROR ("error: %s\n", "listen"));
148 _closesocket (_sock
);
157 /* accept incomming connection */
159 int accept_incoming_connection (void)
161 if (sock
== INVALID_SOCKET
) {
162 VERBOSE (ERROR
, PERROR ("Can't accept connection from closed socket\n"));
166 if (conn
!= INVALID_SOCKET
) {
168 conn
= INVALID_SOCKET
;
170 socket_t _conn
= accept (sock
, NULL
, 0);
171 if (_conn
== INVALID_SOCKET
) {
175 #ifndef _WIN32 /* POSIX */
176 fcntl (_conn
, F_SETFL
, O_NONBLOCK
);
179 int rc
= setsockopt (_conn
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
181 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
182 _closesocket (_conn
);
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: */