= ์ถ๊ฐ ์๊ตฌ์ฌํญ =
- ํํ์ด์ง ๋์จ ๋ด์ฉ.
- ์์ ์ ์ฃผ์ ๋ฑ์ ๋ฐ๋ผ ์ํ๋ ํจํท๋ง ๋ถ์
2. IP ํค๋์ graphicalํ ํ์
- ๋ฆฌ์คํธ์์ ํ๋์ ํจํท์ ์ ํํ๋ฉด IP ํค๋๋ฅผ ๋ถ์ํด์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ
3. ethereal์ ๊ธฐ๋ฅ ์ค 1๊ฐ ๋๋ ์๋ก์ด ๊ธฐ๋ฅ์ ํ๊ฐ์ง ๊ตฌํ
- ์, TCP connection ์ค์ ๊ณผ์ ๋ถ์
- ์ด๋ฐ, -_-; ํ ๊ฒ ๋์ด๋ฒ๋ ธ๋น
๋คํธ์ํฌ ์์ ๋ฅผ ํ๋ ๊ฑด์ง GUI์ฝ๋ฉ์ ํ๋ ๊ฑด์ง...
- ใ
ใ
๊ทธ๋ฌ๊ฒ ์์ง์ผ์ง... ใ
ใ
ใ
- eternalbleu
1. WSAIoctl ¶
WSAIoctl ์ ์์ผ์ด๋ ํธ๋์คํฌํธ ๊ณ์ธต ํ๋กํ ์ฝ, ํต์ ์์คํ
์ ๊ตฌ์ฑ๊ณผ ๊ด๋ จ๋ ์ฌํญ์ ์ค์ ํ๊ฑฐ๋ ์ค์ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ์ํด์ ๋ง๋ค์ด์ก๋ค.
WSA prefix ๋ฅผ ๊ฐ์ง ํจ์์ ๊ฒฝ์ฐ ๋๋ถ๋ถ Winsock 2์์ ์ ๊ณต ๋๊ธฐ ์์ํ ๊ฒ์ด๋ฉฐ, ์ด WSAIoctl ์ญ์๋ ์์ 2์์ ์ง์๋๋ค.
๋คํธ์ํฌ์ 3๋ฒ์งธ ํ๋ก์ ํธ๋ฅผ ํ๊ธฐ์ํด์๋ SIO_RCVALL ๋ผ๋ ์ต์ ์ ์ค์ ํ์ฌ ์ฌ์ฉํ ์ค ์์์ผํ๋ค. ์ ์ฌํ ์ต์ ์ผ๋ก๋
SIO_RCVALL_IGMPMCAST, SIO_RCVALL_MCAST ๊ฐ์๋ค.
์์ธํ ์ฌํญ์ MSDN ํน์ Network Programming For Microsoft Windows ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋ฐ๋๋ค.
โป ์๋์ฐ ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์ํด์๋ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ด linking ํด์ผํ๋ฉฐ, WSActrl ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ winsock2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ws2_32.lib ๋ฅผ ํฌํจํด์ผํ๋ค.
WSA prefix ๋ฅผ ๊ฐ์ง ํจ์์ ๊ฒฝ์ฐ ๋๋ถ๋ถ Winsock 2์์ ์ ๊ณต ๋๊ธฐ ์์ํ ๊ฒ์ด๋ฉฐ, ์ด WSAIoctl ์ญ์๋ ์์ 2์์ ์ง์๋๋ค.
๋คํธ์ํฌ์ 3๋ฒ์งธ ํ๋ก์ ํธ๋ฅผ ํ๊ธฐ์ํด์๋ SIO_RCVALL ๋ผ๋ ์ต์ ์ ์ค์ ํ์ฌ ์ฌ์ฉํ ์ค ์์์ผํ๋ค. ์ ์ฌํ ์ต์ ์ผ๋ก๋
SIO_RCVALL_IGMPMCAST, SIO_RCVALL_MCAST ๊ฐ์๋ค.
์์ธํ ์ฌํญ์ MSDN ํน์ Network Programming For Microsoft Windows ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋ฐ๋๋ค.
~cpp #include <mstcpip.h>โป 'SIO_RCVALL' : undeclared identifier ์๋ฌ๊ฐ ๋ฐ ๊ฒฝ์ฐ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐ ํ๋ค.
~cpp #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
2. Sample Code ¶
~cpp int _cdecl main(int argc, char **argv) { SOCKET s; WSADATA wsd; SOCKADDR_IN if0; int ret, count; unsigned int optval; DWORD dwBytesRet, dwFlags, nproc; char rcvbuf[MAX_IP_SIZE]; WSABUF wbuf; // Load Winsock // if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { printf("WSAStartup() failed: %d\n", GetLastError()); return -1; } // Parse the command line // ValidateArgs(argc, argv); if (bFilter) { printf("Source Port: %d\n", usSourcePort); printf("Dest Port: %d\n", usDestPort); } // Create a raw socket for receiving IP datagrams // s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED); if (s == INVALID_SOCKET) { printf("WSASocket() failed: %d\n", WSAGetLastError()); return -1; } // Get an interface to read IP packets on // if (GetInterface(s, &if0, dwInterface) != 0) { printf("Unable to obtain an interface\n"); return -1; } printf("Binding to IF: %s\n", inet_ntoa(if0.sin_addr)); // // This socket MUST be bound before calling the ioctl // if0.sin_family = AF_INET; if0.sin_port = htons(0); if (bind(s, (SOCKADDR *)&if0, sizeof(if0)) == SOCKET_ERROR) { printf("bind() failed: %d\n", WSAGetLastError()); return -1; } // // Set the SIO_RCVALLxxx ioctl // optval = 1; if (WSAIoctl(s, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR) { printf("WSAIotcl(%d) failed; %d\n", dwIoControlCode, WSAGetLastError()); return -1; } // Start receiving IP datagrams until interrupted // count = 0; while (1) { wbuf.len = MAX_IP_SIZE; wbuf.buf = rcvbuf; dwFlags = 0; ret = WSARecv(s, &wbuf, 1, &dwBytesRet, &dwFlags, NULL, NULL); if (ret == SOCKET_ERROR) { printf("WSARecv() failed: %d\n", WSAGetLastError()); return -1; } // Decode the IP header // } // Cleanup // closesocket(s); WSACleanup(); return 0; }
์๊ธฐ์ ๊ฐ์ด ๊ธฐ์กด์ ์๋ฒ ํ๋ก๊ทธ๋จ๊ณผ ๋ค๋ฅธ ์ ์ ๋ณ๋ก ์๋ค. (Listen๊ณผ accept๊ฐ ์๋ค์. WSAIoctrl์์ ๋ค ์ฒ๋ฆฌํ๋๊ฑด์ง...) ๋จ์ง ์์ผ์ ioctrl ๋ก ์กฐ์ ํด์ ip ์์ค์์ ์ฌ๋ผ์ค๋ ํจํท์ ๊ธฐ์กด๊ณผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ ๋ฟ์ด๋ค.
SIO_RCVALL ์ ํตํด์ NIC๋ฅผ ํตํด ์ฌ๋ผ์ค๋ ๋ชจ๋ ํจํท์ ์บก์ณ๊ฐ ๊ฐ๋ฅํ๋ค. NIC๋ฅผ ํตํด ๋๊ฐ๋ ํจํท์ ์บก์ณํ์ง ๋ชปํ๋ ๋ฏ ํ๋ค.
์๋ง๋ listen, accept ๊ฐ ํจํท ํํฐ๋ง์ ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ dst ์๊ด์์ด ๋ฌด์กฐ๊ฒ application ๊น์ง ์ฌ๋ผ์ค๋๊น ํ์์๋ ๊ฒ์ด ์๋๊น? ๊ทธ๋ฐ ์๊ฐํ๊ณ ์์.
- eternalbleu
SIO_RCVALL ์ ํตํด์ NIC๋ฅผ ํตํด ์ฌ๋ผ์ค๋ ๋ชจ๋ ํจํท์ ์บก์ณ๊ฐ ๊ฐ๋ฅํ๋ค. NIC๋ฅผ ํตํด ๋๊ฐ๋ ํจํท์ ์บก์ณํ์ง ๋ชปํ๋ ๋ฏ ํ๋ค.

3. ์ฐธ๊ณ ¶
- MFC ๊ฐ ๋ฐ์ดํฐ ํ์
ํฌ๊ธฐ
bool 1 byte
char, unsigned char, signed char 1 byte
short, unsigned short 2 bytes
int, unsigned int 4 bytes
__intn 1, 2, 4, or 8 bytes depending on the value of n. __intn is Microsoft-specific.
long, unsigned long 4 bytes
float 4 bytes
double 8 bytes
long double1 8 bytes
long long Equivalent to __int64.
4. ๋ฐ์ดํฐ ๋ณํ ¶
const char* szIpAddr to DWORD ipvalue
inet_addr() :
Unsigned short interger ๋ณํ (2๋ฐ์ดํธ ์ฒด๊ณ)
htons() : host-to-network ๋ฐ์ดํธ ๋ณํ
ntohs() : network-to-host ๋ฐ์ดํธ ๋ณํ
Unsigned long interger ๋ณํ (4๋ฐ์ดํธ ์ฒด๊ณ)
htonl() : host-to-network ๋ฐ์ดํธ ๋ณํ
ntohl() : network-to-host ๋ฐ์ดํธ ๋ณํ
inet_addr() :
htons() : host-to-network ๋ฐ์ดํธ ๋ณํ
ntohs() : network-to-host ๋ฐ์ดํธ ๋ณํ
htonl() : host-to-network ๋ฐ์ดํธ ๋ณํ
ntohl() : network-to-host ๋ฐ์ดํธ ๋ณํ
5. ์ถ์ฒ ๊ฐ๋ฐ ๊ณผ์ ¶
(1) ์ฝ์๋ก ์บก์ณ๊ธฐ, ํํฐ, ์ปจํ
์ด๋ ํด๋์ค๋ฅผ ๊ตฌ์ฑํ๋ค.
ํํฐ๊ธฐ๋ ๊ฐ๋ฅํ๋ฉด propery ๋ฅผ ์ค์ ํด์ ๋์ํ๋๋ก ๊ตฌ์ฑํ๋ค.
(2) MFC, VB ๋ฑ์ ์ด์ฉํด์ GUI ๋ถ๋ถ์ ์ง ๋ค. (ํต์ฌ์ ๋ฆฌํฌํธ ๋ชจ๋ ์์ฑ)
์ปจํ
์ด๋์ ๋ฆฌ์คํธ ์ปจํธ๋กค์ ์ต์ ๋ฒ ํจํด์ผ๋ก ์ฐ๊ฒฐํ ๊ฒ์ ์ผ๋์ ๋๋ค.
์บก์ณ๊ธฐ์ ๋์์ผ๋ก ์ธํ UI ๋๋ ์ด ํ์์ ๋ง๊ธฐ์ํด์ ์ฐ๋ ๋๋ฅผ ์ด์ฉ.
(3) ๋ง๋ค์ด์ง front-end, back-end ๋ฅผ ํตํฉํ๋ค.
์บก์ณ๊ธฐ์ ๋์์ผ๋ก ์ธํ UI ๋๋ ์ด ํ์์ ๋ง๊ธฐ์ํด์ ์ฐ๋ ๋๋ฅผ ์ด์ฉ.
๋ฆฌํฌํธ ๋ชจ๋์ ๋ฆฌ์คํธ ์ปจํธ๋กค๊ณผ ์ต์ ๋ฒ ํจํด ํน์ ์ด๋ฒคํธ ๋๋ฆฌ๋ธ์ผ๋ก ์ฐ๋
6. postscript ¶
์ผ๋จ ์บก์ณ๊ธฐ๋ง ์์ฑํ๋ ๊ทธ์ผ๋ง๋ก ์ผ์ฌ์ฒ๋ฆฌ๋ก ํ๋ฆฌ๋๋ฐ -_-; ๊ท์ฐจ๋์ฆ์ด ๋ฐ๋ํ๋๊ตฌ๋ง.. ์ฟจ๋ญ - eternalbleu