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 terminate_network_context (void)
89 #ifdef _WIN32 /* Windows */
94 /* open listening socket */
96 int open_listening_socket (int port
)
100 VERBOSE (DEBUG
, PRINT ("Opening socket\n"));
101 //socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
102 if (sock
!= INVALID_SOCKET
) {
103 int rc
= closesocket (sock
);
104 if (rc
== SOCKET_ERROR
) {
105 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
107 sock
= INVALID_SOCKET
;
109 sock
= socket (AF_INET
, SOCK_STREAM
, 0);
110 if (sock
== INVALID_SOCKET
) {
114 struct sockaddr_in addr
= {0};
115 //bzero (&addr, sizeof (addr));
116 //addr.sin_family = PF_INET;
117 addr
.sin_family
= AF_INET
;
118 addr
.sin_port
= htons (port
);
119 addr
.sin_addr
.s_addr
= htonl (INADDR_ANY
);
121 VERBOSE (DEBUG
, PRINT ("Binding socket\n"));
122 //setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val));
123 int rc
= bind (sock
, (struct sockaddr
*)&addr
, sizeof (addr
));
124 if (rc
== SOCKET_ERROR
) {
125 VERBOSE (ERROR
, PERROR ("error: bind %d\n", ERRNO
));
126 rc
= closesocket (sock
);
127 if (rc
== SOCKET_ERROR
) {
128 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
130 sock
= INVALID_SOCKET
;
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"));
142 if (rc
== SOCKET_ERROR
) {
143 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
145 sock
= INVALID_SOCKET
;
149 rc
= listen (sock
, BACKLOG
);
151 VERBOSE (ERROR
, PERROR ("error: %s\n", "listen"));
153 if (rc
== SOCKET_ERROR
) {
154 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
156 sock
= INVALID_SOCKET
;
163 /* accept incomming connection */
165 int accept_incoming_connection (void)
167 if (sock
== INVALID_SOCKET
) {
168 VERBOSE (ERROR
, PERROR ("Can't accept connection from closed socket\n"));
172 if (conn
!= INVALID_SOCKET
) {
173 int rc
= closesocket (conn
);
174 if (rc
== SOCKET_ERROR
) {
175 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
177 conn
= INVALID_SOCKET
;
179 conn
= accept (sock
, NULL
, 0);
180 if (conn
== INVALID_SOCKET
) {
184 #ifndef _WIN32 /* POSIX */
185 fcntl (conn
, F_SETFL
, O_NONBLOCK
);
188 int rc
= setsockopt (conn
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
190 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
192 if (rc
== SOCKET_ERROR
) {
193 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
195 conn
= INVALID_SOCKET
;
202 /* close connection socket */
204 void close_connection (void)
206 int rc
= closesocket (conn
);
207 if (rc
== SOCKET_ERROR
) {
208 VERBOSE (ERROR
, PERROR ("error: %d\n", ERRNO
));
210 conn
= INVALID_SOCKET
;
213 /* receive data from socket */
215 int receive_data (unsigned char **pdata
)
217 unsigned char buffer
[BUFFER_SIZE
] = {0};
218 unsigned char *data
= NULL
;
221 if (conn
== INVALID_SOCKET
) {
222 VERBOSE (ERROR
, PERROR ("Can't read data from closed socket\n"));
228 /* timeout management */
230 struct timeval tv
= { 0, TIMEOUT
};
232 FD_SET (conn
, &rfds
);
234 int retval
= select (conn
+ 1, &rfds
, NULL
, NULL
, &tv
);
235 if (retval
!= 1) { /* 0 or SOCKET_ERROR */
239 /* read from socket */
240 int rc
= read (conn
, buffer
, BUFFER_SIZE
);
242 if (rc
== 0) { /* sock closed */
250 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
259 data
= realloc (data
, len
+ rc
);
260 memcpy (data
+ len
, buffer
, rc
);
271 /* send data onto socket */
273 int send_data (unsigned char *data
, int len
)
277 if (conn
== INVALID_SOCKET
) {
278 VERBOSE (ERROR
, PERROR ("Can't read data from closed socket\n"));
282 while (index
< len
) {
283 int rc
= write (conn
, data
+ index
, len
- index
);
285 if (rc
== 0) { /* sock closed */
288 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
299 /* vim: set ts=4 sw=4 et: */