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>
30 #ifdef _WIN32 /* Windows */
31 #define PF_INET AF_INET
32 #define ERRNO (WSAGetLastError ())
34 #define closesocket close
36 #define SOCKET_ERROR -1
44 #define BUFFER_SIZE 4096
45 #define TIMEOUT 100000
51 /* init network context */
53 void init_network_context (void)
55 #ifdef _WIN32 /* Windows */
57 WSAStartup (MAKEWORD(2,0), &WSAData
);
58 assert (INVALID_SOCKET
== (socket_t
)-1);
59 assert (SOCKET_ERROR
== -1);
63 /* terminate network context */
65 void terminate_network_context (void)
67 #ifdef _WIN32 /* Windows */
72 /* open listening socket */
74 socket_t
open_listening_socket (int port
)
78 VERBOSE (DEBUG
, PRINT ("Opening socket\n"));
79 //socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
80 socket_t sock
= socket (AF_INET
, SOCK_STREAM
, 0);
81 if (sock
== INVALID_SOCKET
) {
85 struct sockaddr_in addr
= {0};
86 //bzero (&addr, sizeof (addr));
87 //addr.sin_family = PF_INET;
88 addr
.sin_family
= AF_INET
;
89 addr
.sin_port
= htons (port
);
90 addr
.sin_addr
.s_addr
= htonl (INADDR_ANY
);
92 VERBOSE (DEBUG
, PRINT ("Binding socket\n"));
93 //setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val));
94 int rc
= bind (sock
, (struct sockaddr
*)&addr
, sizeof (addr
));
95 if (rc
== SOCKET_ERROR
) {
96 VERBOSE (ERROR
, PERROR ("error: bind %d\n", ERRNO
));
97 rc
= closesocket (sock
);
98 if (rc
== SOCKET_ERROR
) {
99 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
104 VERBOSE (DEBUG
, PRINT ("Configuring socket\n"));
105 #ifndef _WIN32 /* Posix */
106 fcntl (sock
, F_SETFL
, O_NONBLOCK
);
108 rc
= setsockopt (sock
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
110 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
112 if (rc
== SOCKET_ERROR
) {
113 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
118 rc
= listen (sock
, BACKLOG
);
120 VERBOSE (ERROR
, PERROR ("error: %s\n", "listen"));
122 if (rc
== SOCKET_ERROR
) {
123 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
131 /* accept incomming connection */
133 socket_t
accept_incoming_connection (socket_t sock
)
135 socket_t connection
= accept (sock
, NULL
, 0);
136 if (connection
== INVALID_SOCKET
) {
137 return INVALID_SOCKET
;
140 #ifndef _WIN32 /* POSIX */
141 fcntl (connection
, F_SETFL
, O_NONBLOCK
);
144 int rc
= setsockopt (connection
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
146 VERBOSE (ERROR
, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY"));
147 closesocket (connection
);
148 if (rc
== SOCKET_ERROR
) {
149 VERBOSE (ERROR
, PERROR ("error: close %d\n", ERRNO
));
151 return INVALID_SOCKET
;
157 /* close listening socket */
159 void close_socket (socket_t sock
)
161 int rc
= closesocket (sock
);
162 if (rc
== SOCKET_ERROR
) {
163 VERBOSE (ERROR
, PERROR ("error: %d\n", ERRNO
));
167 /* receive data from socket */
169 int receive_data (socket_t sock
, unsigned char **pdata
)
171 unsigned char buffer
[BUFFER_SIZE
] = {0};
172 unsigned char *data
= NULL
;
177 /* timeout management */
179 struct timeval tv
= { 0, TIMEOUT
};
181 FD_SET (sock
, &rfds
);
183 int retval
= select (sock
+ 1, &rfds
, NULL
, NULL
, &tv
);
184 if (retval
!= 1) { /* 0 or SOCKET_ERROR */
188 /* read from socket */
189 int rc
= read (sock
, buffer
, BUFFER_SIZE
);
191 if (rc
== 0) { /* sock closed */
199 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
208 data
= realloc (data
, len
+ rc
);
209 memcpy (data
+ len
, buffer
, rc
);
220 /* send data onto socket */
222 int send_data (socket_t sock
, unsigned char *data
, int len
)
226 while (index
< len
) {
227 int rc
= write (sock
, data
+ index
, len
- index
);
229 if (rc
== 0) { /* sock closed */
232 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
243 /* vim: set ts=4 sw=4 et: */