3 /* linker: color.o debug.o */
9 #ifdef _WIN32 /* Windows */
16 #include <netinet/ip.h>
17 #include <netinet/tcp.h>
18 //#include <sys/types.h>
19 //#include <sys/socket.h>
20 #include <sys/select.h>
29 #ifdef _WIN32 /* Windows */
30 #define PF_INET AF_INET
31 #define ERRNO (WSAGetLastError ())
33 #define closesocket close
35 #define SOCKET_ERROR -1
43 #define BUFFER_SIZE 4096
44 #define TIMEOUT 100000
50 /* init network context */
52 void init_network_context (void)
54 #ifdef _WIN32 /* Windows */
56 WSAStartup (MAKEWORD(2,0), &WSAData
);
57 assert (INVALID_SOCKET
== (socket_t
)-1);
58 assert (SOCKET_ERROR
== -1);
62 /* terminate network context */
64 void terminate_network_context (void)
66 #ifdef _WIN32 /* Windows */
71 /* open listening socket */
73 socket_t
open_listening_socket (int port
)
75 VERBOSE (DEBUG
, fprintf (stdout
, "Opening socket\n"));
76 socket_t sock
= socket (PF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
77 if (sock
== INVALID_SOCKET
) {
81 struct sockaddr_in addr
= {0};
82 addr
.sin_family
= PF_INET
;
83 addr
.sin_port
= htons (port
);
84 addr
.sin_addr
.s_addr
= htonl (INADDR_ANY
);
86 VERBOSE (DEBUG
, fprintf (stdout
, "Binding socket\n"));
87 int rc
= bind (sock
, (struct sockaddr
*)&addr
, sizeof (addr
));
88 if (rc
== SOCKET_ERROR
) {
89 VERBOSE (ERROR
, fprintf (stderr
, "error: bind %d\n", ERRNO
));
90 rc
= closesocket (sock
);
91 if (rc
== SOCKET_ERROR
) {
92 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
97 VERBOSE (DEBUG
, fprintf (stdout
, "Configuring socket\n"));
98 #ifndef _WIN32 /* Posix */
99 fcntl (sock
, F_SETFL
, O_NONBLOCK
);
102 rc
= setsockopt (sock
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
104 VERBOSE (ERROR
, fprintf (stderr
, "error: %s\n", "setsockopt/TCP_NODELAY"));
106 if (rc
== SOCKET_ERROR
) {
107 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
112 rc
= listen (sock
, BACKLOG
);
114 VERBOSE (ERROR
, fprintf (stderr
, "error: %s\n", "listen"));
116 if (rc
== SOCKET_ERROR
) {
117 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
125 /* accept incomming connection */
127 socket_t
accept_incoming_connection (socket_t sock
)
129 socket_t connection
= accept (sock
, NULL
, 0);
130 if (connection
< 0) {
131 return INVALID_SOCKET
;
134 #ifndef _WIN32 /* POSIX */
135 fcntl (connection
, F_SETFL
, O_NONBLOCK
);
138 int rc
= setsockopt (connection
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
140 VERBOSE (ERROR
, fprintf (stderr
, "error: %s\n", "setsockopt/TCP_NODELAY"));
141 closesocket (connection
);
142 if (rc
== SOCKET_ERROR
) {
143 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
145 return INVALID_SOCKET
;
151 /* close listening socket */
153 void close_socket (socket_t sock
)
155 int rc
= closesocket (sock
);
156 if (rc
== SOCKET_ERROR
) {
157 VERBOSE (ERROR
, fprintf (stderr
, "error: %d\n", ERRNO
));
161 /* receive data from socket */
163 int receive_data (socket_t sock
, unsigned char **pdata
)
165 unsigned char buffer
[BUFFER_SIZE
] = {0};
166 unsigned char *data
= NULL
;
171 /* timeout management */
173 struct timeval tv
= { 0, TIMEOUT
};
175 FD_SET (sock
, &rfds
);
177 int retval
= select (sock
+ 1, &rfds
, NULL
, NULL
, &tv
);
178 if (retval
!= 1) { /* 0 or SOCKET_ERROR */
182 /* read from socket */
183 int rc
= read (sock
, buffer
, BUFFER_SIZE
);
185 if (rc
== 0) { /* sock closed */
193 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
202 data
= realloc (data
, len
+ rc
);
203 memcpy (data
+ len
, buffer
, rc
);
214 /* send data onto socket */
216 int send_data (socket_t sock
, unsigned char *data
, int len
)
220 while (index
< len
) {
221 int rc
= write (sock
, data
+ index
, len
- index
);
223 if (rc
== 0) { /* sock closed */
226 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
237 /* vim: set ts=4 sw=4 et: */