3 /* linker: color.o debug.o */
8 #ifdef _WIN32 /* Windows */
15 #include <netinet/ip.h>
16 #include <netinet/tcp.h>
17 //#include <sys/types.h>
18 //#include <sys/socket.h>
27 #ifdef _WIN32 /* Windows */
28 typedef SOCKET socket_t
;
29 #define PF_INET AF_INET
30 #define ERRNO (WSAGetLastError ())
33 #define closesocket close
35 #define SOCKET_ERROR -1
41 #define BUFFER_SIZE 4096
42 #define TIMEOUT 100000
48 /* open listening socket */
50 socket_t
open_listening_socket (int port
)
52 #ifdef _WIN32 /* Windows */
54 WSAStartup (MAKEWORD(2,0), &WSAData
);
55 assert (INVALID_SOCKET
== (socket_t
)-1);
56 assert (SOCKET_ERROR
== -1);
59 VERBOSE (DEBUG
, fprintf (stdout
, "Opening socket\n"));
60 socket_t sock
= socket (PF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
61 if (sock
== INVALID_SOCKET
) {
65 struct sockaddr_in addr
= {0};
66 addr
.sin_family
= PF_INET
;
67 addr
.sin_port
= htons (port
);
68 addr
.sin_addr
.s_addr
= htonl (INADDR_ANY
);
70 VERBOSE (DEBUG
, fprintf (stdout
, "Binding socket\n"));
71 int rc
= bind (sock
, (struct sockaddr
*)&addr
, sizeof (addr
));
72 if (rc
== SOCKET_ERROR
) {
73 VERBOSE (ERROR
, fprintf (stderr
, "error: bind %d\n", ERRNO
));
74 rc
= closesocket (sock
);
75 if (rc
== SOCKET_ERROR
) {
76 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
81 VERBOSE (DEBUG
, fprintf (stdout
, "Configuring socket\n"));
82 #ifndef _WIN32 /* Posix */
83 fcntl (sock
, F_SETFL
, O_NONBLOCK
);
86 rc
= setsockopt (sock
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
88 VERBOSE (ERROR
, fprintf (stderr
, "error: %s\n", "setsockopt/TCP_NODELAY"));
90 if (rc
== SOCKET_ERROR
) {
91 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
96 rc
= listen (sock
, BACKLOG
);
98 VERBOSE (ERROR
, fprintf (stderr
, "error: %s\n", "listen"));
100 if (rc
== SOCKET_ERROR
) {
101 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
109 /* close listening socket */
110 void close_listening_socket (socket_t sock
)
112 int rc
= closesocket (sock
);
113 if (rc
== SOCKET_ERROR
) {
114 VERBOSE (ERROR
, fprintf (stderr
, "error: %d\n", ERRNO
));
116 #ifdef _WIN32 /* Windows */
121 /* accept incomming connection */
123 int accept_incoming_connection (socket_t sock
)
125 int connection
= accept (sock
, NULL
, 0);
126 if (connection
< 0) {
130 #ifndef _WIN32 /* POSIX */
131 fcntl (connection
, F_SETFL
, O_NONBLOCK
);
134 rc
= setsockopt (connection
, IPPROTO_TCP
, TCP_NODELAY
, (char *)&val
, sizeof (val
));
136 VERBOSE (ERROR
, fprintf (stderr
, "error: %s\n", "setsockopt/TCP_NODELAY"));
137 closesocket (connection
);
138 if (rc
== SOCKET_ERROR
) {
139 VERBOSE (ERROR
, fprintf (stderr
, "error: close %d\n", ERRNO
));
148 int receive_data (socket_t sock
, unsigned char data
, int maxlen
)
151 /* timeout management */
153 struct timeval tv
= { 0, TIMEOUT
};
155 FD_SET (sock
, &rfds
);
157 int retval
= select (sock
+ 1, &rfds
, NULL
, NULL
, &tv
);
159 return retval
; /* 0 or SOCKET_ERROR */
161 /* read from socket */
162 int len
= read (sock
, data
, maxlen
);
164 if (rc
= 0) { /* sock closed */
166 } else if ((rc
< 0) && (ERRNO
!= EAGAIN
)) { /* error */
178 /* vim: set ts=4 sw=4 et: */