= μΆκ° μꡬμ¬ν =
- ννμ΄μ§ λμ¨ λ΄μ©.
- μμ μ μ£Όμ λ±μ λ°λΌ μνλ ν¨ν·λ§ λΆμ
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