Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit 6204157

Browse files
committed
Merge pull request #150 from toshiyuki-ogawa/win-client-server-test
To work server and client test program on Windows.
2 parents de657e2 + 33f1254 commit 6204157

File tree

2 files changed

+82
-7
lines changed

2 files changed

+82
-7
lines changed

client.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ void error(const char *msg)
189189
exit(0);
190190
}
191191

192+
192193
int main(int argc, char *argv[])
193194
{
194195
int sockfd, portno, n;
@@ -214,10 +215,9 @@ int main(int argc, char *argv[])
214215
exit(0);
215216
}
216217
bzero((char *) &serv_addr, sizeof(serv_addr));
218+
217219
serv_addr.sin_family = AF_INET;
218-
bcopy((char *)server->h_addr,
219-
(char *)&serv_addr.sin_addr.s_addr,
220-
server->h_length);
220+
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
221221
serv_addr.sin_port = htons(portno);
222222
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
223223
error("ERROR connecting");

server.c

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
#include <string.h>
66
#include <unistd.h>
77
#include <sys/types.h>
8+
#include <fcntl.h>
89
#ifdef WIN32
910
#include <winsock2.h>
1011
#include <ws2tcpip.h>
12+
#include <fcntl.h>
1113

1214
static void bzero(void *address, int length)
1315
{
@@ -16,14 +18,86 @@ static void bzero(void *address, int length)
1618
#else
1719
#include <sys/socket.h>
1820
#include <netinet/in.h>
21+
#include <io.h>
1922
#endif
20-
21-
void error(const char *msg)
23+
void error(const char *fmt, ...)
2224
{
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);
2431
exit(1);
2532
}
2633

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
27101
int main(int argc, char *argv[])
28102
{
29103
int sockfd, newsockfd, portno;
@@ -45,7 +119,7 @@ int main(int argc, char *argv[])
45119
bzero((char *) &serv_addr, sizeof(serv_addr));
46120
portno = atoi(argv[1]);
47121
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");
49123
serv_addr.sin_port = htons(portno);
50124
if (bind(sockfd, (struct sockaddr *) &serv_addr,
51125
sizeof(serv_addr)) < 0)
@@ -67,3 +141,4 @@ int main(int argc, char *argv[])
67141
#endif
68142
return 0;
69143
}
144+

0 commit comments

Comments
 (0)