JNetLibray
로딩중...
검색중...
일치하는것 없음
WinSocketAPI.cpp 파일 참조
#include "WinSocketAPI.h"

함수

int InitWindowSocketLib (LPWSADATA pWsaData)
 
SOCKET CreateWindowSocket_IPv4 (bool isTCP, int *errCode)
 
SOCKADDR_IN CreateDestinationADDR (const char *destIP, uint16 destPort)
 
SOCKADDR_IN CreateDestinationADDR (IN_ADDR destInAddr, uint16 destPort)
 
SOCKADDR_IN CreateDestinationADDR_LoopBack (uint16 destPort)
 
SOCKADDR_IN CreateDestinationADDR_byDomain (WCHAR *destDomain, uint16 destPort)
 
bool ConnectToDestination (const SOCKET &sock, const SOCKADDR_IN &destAddr, int *errCode)
 
SOCKADDR_IN CreateServerADDR (const char *serverIP, uint16 port)
 
SOCKADDR_IN CreateServerADDR_ANY (uint16 port)
 
SOCKADDR_IN CreateServerADDR_LoopBack (uint16 port)
 
bool BindSocket (SOCKET &sock, SOCKADDR_IN &serverAddr, int *errCode)
 
bool ListenSocket (SOCKET &sock, int backlog, int *errCode)
 
SOCKET AcceptSocket (SOCKET &sock, SOCKADDR_IN &clientAddr, int *errCode)
 
void IN_ADDR_TO_STRING (const IN_ADDR &inAddr, char ipStr[16])
 
bool DomainAddrToIP (WCHAR *szDomain, IN_ADDR *pAddr)
 

함수 문서화

◆ InitWindowSocketLib()

int InitWindowSocketLib ( LPWSADATA pWsaData)
4{
5 // winsock.h
6 // Windows 소켓 함수들을 호출하기 전 첫 번째로 호출되어야 하는 초기화 함수
7 // (ws2_32 라이브러리 초기화)
8 // 또한 소켓 구현의 세부 정보를 담는 WSADATA 데이터 획득
9 return ::WSAStartup(MAKEWORD(2, 2), pWsaData);
10 // 성공 시 0 반환
11 // 실패 시 오류 코드 반환
12}

◆ CreateWindowSocket_IPv4()

SOCKET CreateWindowSocket_IPv4 ( bool isTCP,
int * errCode )
15{
16 // winsock2.h
17 // 소캣 생성
18 //SOCKET WSAAPI socket([in] int af, [in] int type, [in] int protocol);
19 // 1) 주소 패밀리 지정: IPv4, IPv6 ..
20 // 2) 소켓 타입 지정: SOCK_STREAM(TCP), SOCK_DGRAM(UDP) ..
21 // 3) 프로토콜 지정: ('0' 전달, 2번째 매개변수인 소켓 타입을 지정하면, 이에 맞는 프로토콜로 셋팅됨)
22 // cf) 소문자로 되어있는 API는 리눅스 환경에서도 동작할 가능성이 높다
23
24 SOCKET sock; // typedef UINT_PTR SOCKET;
25
26 if (isTCP) {
27 sock = ::socket(AF_INET, SOCK_STREAM, 0); // SOCK_STREAM - TCP(자동 설정)
28 }
29 else {
30 sock = ::socket(AF_INET, SOCK_DGRAM, 0); // SOCK_DGRAM - UDP(자동 설정)
31 }
32
33 if (sock == INVALID_SOCKET) {
34 if (errCode != NULL) {
35 *errCode = ::WSAGetLastError();
36 }
37 }
38
39 return sock;
40}

◆ CreateDestinationADDR() [1/2]

SOCKADDR_IN CreateDestinationADDR ( const char * destIP,
uint16 destPort )
46{
47 SOCKADDR_IN destAddr;
48 (void)memset(&destAddr, 0, sizeof(destAddr));
49 destAddr.sin_family = AF_INET;
50 //serverAddr.sin_addr.S_un.S_addr = ::inet_addr("127.0.0.1");
51 // // ULONG S_addr;
52 // // 4바이트 정수로 IPv4 주소 표현
53 // 위 방식은 구식적인 방법, deprecate API warnings 발생! 아래와 같이 설정
54 ::inet_pton(AF_INET, destIP, &destAddr.sin_addr);
55 destAddr.sin_port = ::htons(destPort);
56 // host to network short
57 // 호스트의 리틀 앤디안을 네트워크의 빅 엔디안 표기로
58
59 return destAddr;
60}

◆ CreateDestinationADDR() [2/2]

SOCKADDR_IN CreateDestinationADDR ( IN_ADDR destInAddr,
uint16 destPort )
63{
64 SOCKADDR_IN destAddr;
65 (void)memset(&destAddr, 0, sizeof(destAddr));
66
67 destAddr.sin_family = AF_INET;
68 destAddr.sin_addr = destInAddr;
69 destAddr.sin_port = ::htons(destPort);
70
71 return destAddr;
72}

◆ CreateDestinationADDR_LoopBack()

SOCKADDR_IN CreateDestinationADDR_LoopBack ( uint16 destPort)
74 {
75 return CreateDestinationADDR("127.0.0.1", destPort);
76}
SOCKADDR_IN CreateDestinationADDR(const char *destIP, uint16 destPort)
Definition WinSocketAPI.cpp:45

◆ CreateDestinationADDR_byDomain()

SOCKADDR_IN CreateDestinationADDR_byDomain ( WCHAR * destDomain,
uint16 destPort )
79{
80 IN_ADDR inAddr;
81 DomainAddrToIP(destDomain, &inAddr);
82 return CreateDestinationADDR(inAddr, destPort);
83}
bool DomainAddrToIP(WCHAR *szDomain, IN_ADDR *pAddr)
Definition WinSocketAPI.cpp:233

◆ ConnectToDestination()

bool ConnectToDestination ( const SOCKET & sock,
const SOCKADDR_IN & destAddr,
int * errCode )
86{
87 int ret = ::connect(sock, (SOCKADDR*)&destAddr, sizeof(destAddr));
88 if (ret == SOCKET_ERROR) {
89 if (errCode != NULL) {
90 *errCode = ::WSAGetLastError();
91 }
92 return false;
93 }
94 else {
95 return true;
96 }
97}

◆ CreateServerADDR()

SOCKADDR_IN CreateServerADDR ( const char * serverIP,
uint16 port )
137{
138 SOCKADDR_IN serverAddr;
139 (void)memset(&serverAddr, 0, sizeof(serverAddr));
140 serverAddr.sin_family = AF_INET;
141
142 ::inet_pton(AF_INET, serverIP, &serverAddr.sin_addr);
143
144 // ::htonl(INADDR_ANY);
145 // 서버의 네트워크 카드가 여러 개인 경우 주소가 여러 개 존재
146 // 이 때 하드코딩하여 서버의 주소를 고정시킬 경우 이 주소로만 연결될 것
147 // 하지만 INADDR_ANY 인자를 전달하여 루프백 주소를 포함하여 연결될 수 있는
148 // 모든 주소를 연결할 수 있게 만든다.
149 // 루프백 주소도 포함된다.
150
151 serverAddr.sin_port = ::htons(port);
152 // host to network short
153 // 호스트의 리틀 앤디안을 네트워크의 빅 엔디안 표기로
154
155 return serverAddr;
156}

◆ CreateServerADDR_ANY()

SOCKADDR_IN CreateServerADDR_ANY ( uint16 port)
159{
160 SOCKADDR_IN serverAddr;
161 (void)memset(&serverAddr, 0, sizeof(serverAddr));
162 serverAddr.sin_family = AF_INET;
163
164 serverAddr.sin_addr.S_un.S_addr = ::htonl(INADDR_ANY);
165 //const char serverIP[] = "172.30.1.100";
166 //::inet_pton(AF_INET, serverIP, &serverAddr.sin_addr);
167
168 // ::htonl(INADDR_ANY);
169 // 서버의 네트워크 카드가 여러 개인 경우 주소가 여러 개 존재
170 // 이 때 하드코딩하여 서버의 주소를 고정시킬 경우 이 주소로만 연결될 것
171 // 하지만 INADDR_ANY 인자를 전달하여 루프백 주소를 포함하여 연결될 수 있는
172 // 모든 주소를 연결할 수 있게 만든다.
173 // 루프백 주소도 포함된다.
174
175 serverAddr.sin_port = ::htons(port);
176 // host to network short
177 // 호스트의 리틀 앤디안을 네트워크의 빅 엔디안 표기로
178
179 return serverAddr;
180}

◆ CreateServerADDR_LoopBack()

SOCKADDR_IN CreateServerADDR_LoopBack ( uint16 port)
182 {
183 return CreateServerADDR("127.0.0.1", port);
184}
SOCKADDR_IN CreateServerADDR(const char *serverIP, uint16 port)
Definition WinSocketAPI.cpp:136

◆ BindSocket()

bool BindSocket ( SOCKET & sock,
SOCKADDR_IN & serverAddr,
int * errCode )
188{
189 int ret;
190 if (ret = ::bind(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
191 if (errCode != NULL) {
192 *errCode = ::WSAGetLastError();
193 }
194 //HandleError("BindSocket(소켓에 IP주소(ex, 설정되지 않은 IP주소) 또는 Port번호(ex, 이미 다른 프로세스가 바인딩한 포트 번호)를 바인딩할 수 없습니다.");
195 return false;
196 }
197 else {
198 return true;
199 };
200}

◆ ListenSocket()

bool ListenSocket ( SOCKET & sock,
int backlog,
int * errCode )
203{
204 int ret;
205 if ((ret = ::listen(sock, backlog)) == SOCKET_ERROR) {
206 if (errCode != NULL) {
207 *errCode = ::WSAGetLastError();
208 }
209 return false;
210 }
211 else {
212 return true;
213 }
214}

◆ AcceptSocket()

SOCKET AcceptSocket ( SOCKET & sock,
SOCKADDR_IN & clientAddr,
int * errCode )
217{
218 int32 addrLen = sizeof(clientAddr);
219 SOCKET clientSock = ::accept(sock, (SOCKADDR*)&clientAddr, &addrLen);
220 if (clientSock == INVALID_SOCKET) {
221 if (errCode != NULL) {
222 *errCode = ::WSAGetLastError();
223 }
224 }
225
226 return clientSock;
227}
__int32 int32
Definition CommTypes.h:6

◆ IN_ADDR_TO_STRING()

void IN_ADDR_TO_STRING ( const IN_ADDR & inAddr,
char ipStr[16] )
229 {
230 inet_ntop(AF_INET, &inAddr.S_un.S_addr, ipStr, 16);
231}

◆ DomainAddrToIP()

bool DomainAddrToIP ( WCHAR * szDomain,
IN_ADDR * pAddr )
234{
235 ADDRINFOW* pAddrInfo;
236 SOCKADDR_IN* pSockAddr;
237 if (GetAddrInfo(szDomain, L"0", NULL, &pAddrInfo) != 0) {
238 return FALSE;
239 }
240 else {
241 pSockAddr = (SOCKADDR_IN*)pAddrInfo->ai_addr;
242 *pAddr = pSockAddr->sin_addr;
243 FreeAddrInfo(pAddrInfo);
244
245 return TRUE;
246 }
247}