5
5
#include <string.h>
6
6
#include <unistd.h>
7
7
#include <sys/types.h>
8
+ #include <fcntl.h>
8
9
#ifdef WIN32
9
10
#include <winsock2.h>
10
11
#include <ws2tcpip.h>
12
+ #include <fcntl.h>
11
13
12
14
static void bzero (void * address , int length )
13
15
{
@@ -16,14 +18,86 @@ static void bzero(void *address, int length)
16
18
#else
17
19
#include <sys/socket.h>
18
20
#include <netinet/in.h>
21
+ #include <io.h>
19
22
#endif
20
-
21
- void error (const char * msg )
23
+ void error (const char * fmt , ...)
22
24
{
23
- perror (msg );
25
+ static char buffer [512 ];
26
+ va_list a_list ;
27
+ va_start (a_list , fmt );
28
+ vsprintf (buffer , fmt , a_list );
29
+ perror (buffer );
30
+ va_end (a_list );
24
31
exit (1 );
25
32
}
26
33
34
+
35
+ #ifdef WIN32
36
+ #undef socket
37
+ static int mingw_socket (int domain , int type , int protocol )
38
+ {
39
+ int sockfd ;
40
+ SOCKET s ;
41
+
42
+ s = WSASocket (domain , type , protocol , NULL , 0 , 0 );
43
+ if (s == INVALID_SOCKET ) {
44
+ /*
45
+ * WSAGetLastError() values are regular BSD error codes
46
+ * biased by WSABASEERR.
47
+ * However, strerror() does not know about networking
48
+ * specific errors, which are values beginning at 38 or so.
49
+ * Therefore, we choose to leave the biased error code
50
+ * in errno so that _if_ someone looks up the code somewhere,
51
+ * then it is at least the number that are usually listed.
52
+ */
53
+ errno = WSAGetLastError ();
54
+ return -1 ;
55
+ }
56
+ /* convert into a file descriptor */
57
+ if ((sockfd = _open_osfhandle (s , O_RDWR |O_BINARY )) < 0 ) {
58
+ closesocket (s );
59
+ fprintf (stderr , "unable to make a socket file descriptor: %s" ,
60
+ strerror (errno ));
61
+ return -1 ;
62
+ }
63
+ return sockfd ;
64
+ }
65
+ #define socket mingw_socket
66
+ #undef bind
67
+ static int mingw_bind (int sockfd , struct sockaddr * sa , size_t sz )
68
+ {
69
+ SOCKET s = (SOCKET )_get_osfhandle (sockfd );
70
+ return bind (s , sa , sz );
71
+ }
72
+ #define bind mingw_bind
73
+
74
+ #undef listen
75
+ int mingw_listen (int sockfd , int backlog )
76
+ {
77
+ SOCKET s = (SOCKET )_get_osfhandle (sockfd );
78
+ return listen (s , backlog );
79
+ }
80
+ #define listen mingw_listen
81
+ #undef accept
82
+ int mingw_accept (int sockfd1 , struct sockaddr * sa , socklen_t * sz )
83
+ {
84
+ int sockfd2 ;
85
+
86
+ SOCKET s1 = (SOCKET )_get_osfhandle (sockfd1 );
87
+ SOCKET s2 = accept (s1 , sa , sz );
88
+
89
+ /* convert into a file descriptor */
90
+ if ((sockfd2 = _open_osfhandle (s2 , O_RDWR |O_BINARY )) < 0 ) {
91
+ int err = errno ;
92
+ closesocket (s2 );
93
+ error ("unable to make a socket file descriptor: %s" ,
94
+ strerror (err ));
95
+ }
96
+ return sockfd2 ;
97
+ }
98
+ #define accept mingw_accept
99
+
100
+ #endif
27
101
int main (int argc , char * argv [])
28
102
{
29
103
int sockfd , newsockfd , portno ;
@@ -45,7 +119,7 @@ int main(int argc, char *argv[])
45
119
bzero ((char * ) & serv_addr , sizeof (serv_addr ));
46
120
portno = atoi (argv [1 ]);
47
121
serv_addr .sin_family = AF_INET ;
48
- serv_addr .sin_addr .s_addr = INADDR_ANY ;
122
+ serv_addr .sin_addr .s_addr = inet_addr ( "127.0.0.1" ) ;
49
123
serv_addr .sin_port = htons (portno );
50
124
if (bind (sockfd , (struct sockaddr * ) & serv_addr ,
51
125
sizeof (serv_addr )) < 0 )
@@ -67,3 +141,4 @@ int main(int argc, char *argv[])
67
141
#endif
68
142
return 0 ;
69
143
}
144
+
0 commit comments