-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathwsocket.cpp
More file actions
132 lines (103 loc) · 2.61 KB
/
Copy pathwsocket.cpp
File metadata and controls
132 lines (103 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#define WIN32_LEAN_AND_MEAN
#include <winstrct.h>
#include <winsock.h>
#include <stdlib.h>
#include <wsocket.hpp>
SOCKET
ConnectTCP(LPCWSTR wszServer, u_short usPort)
{
if (wszServer == NULL)
return INVALID_SOCKET;
if (usPort == 0)
return INVALID_SOCKET;
LPSTR szServer = WideToByteAlloc(wszServer);
// Get server address
u_long haddr = inet_addr(szServer);
// Wasn't IP? Lookup host.
if (haddr == INADDR_NONE)
{
hostent *hent = gethostbyname(szServer);
if (hent == NULL)
{
hfree(szServer);
return INVALID_SOCKET;
}
haddr = *(u_long*)hent->h_addr;
}
hfree(szServer);
return ConnectTCP(haddr, usPort);
}
SOCKET
ConnectTCP(LPCWSTR wszServer, LPCWSTR wszService)
{
if (wszServer == NULL)
return INVALID_SOCKET;
if (wszService == NULL)
return INVALID_SOCKET;
u_short usPort = htons((u_short)wcstoul(wszService, NULL, 0));
if (usPort == 0)
{
// Get port name for service
LPSTR szService = WideToByteAlloc(wszService);
servent *service = getservbyname(szService, "tcp");
hfree(szService);
if (service == NULL)
return INVALID_SOCKET;
usPort = service->s_port;
}
return ConnectTCP(wszServer, usPort);
}
SOCKET ConnectTCP(LPCSTR szServer, LPCSTR szService)
{
if (szServer == NULL)
return INVALID_SOCKET;
if (szService == NULL)
return INVALID_SOCKET;
u_short usPort = htons((u_short)strtoul(szService, NULL, 0));
if (usPort == 0)
{
// Get port name for service
servent *service = getservbyname(szService, "tcp");
if (!service)
return INVALID_SOCKET;
usPort = service->s_port;
}
return ConnectTCP(szServer, usPort);
}
SOCKET ConnectTCP(LPCSTR szServer, u_short usPort)
{
if (szServer == NULL)
return INVALID_SOCKET;
if (usPort == 0)
return INVALID_SOCKET;
// Get server address
u_long haddr = inet_addr(szServer);
// Wasn't IP? Lookup host.
if (haddr == INADDR_NONE)
{
hostent *hent = gethostbyname(szServer);
if (!hent)
return INVALID_SOCKET;
haddr = *(u_long*)hent->h_addr;
}
return ConnectTCP(haddr, usPort);
}
SOCKET ConnectTCP(u_long ulAddress, u_short usPort)
{
// Open socket
SOCKET sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sd == INVALID_SOCKET)
return INVALID_SOCKET;
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = usPort;
addr.sin_addr.s_addr = ulAddress;
if (connect(sd, (sockaddr*)&addr, sizeof addr) == SOCKET_ERROR)
{
int __h_errno = WSAGetLastError();
closesocket(sd);
WSASetLastError(__h_errno);
return INVALID_SOCKET;
}
return sd;
}