<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=ComputerNetworkClass%2FReport2006%2FPacketAnalyzer</id>
	<title>ComputerNetworkClass/Report2006/PacketAnalyzer - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=ComputerNetworkClass%2FReport2006%2FPacketAnalyzer"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=ComputerNetworkClass/Report2006/PacketAnalyzer&amp;action=history"/>
	<updated>2026-05-15T20:00:14Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=ComputerNetworkClass/Report2006/PacketAnalyzer&amp;diff=84247&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0001 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=ComputerNetworkClass/Report2006/PacketAnalyzer&amp;diff=84247&amp;oldid=prev"/>
		<updated>2026-03-26T23:56:05Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0001 pages from live compare&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:56, 26 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l40&quot;&gt;Line 40:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 40:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                    dwFlags,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                    dwFlags,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                    nproc;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                    nproc;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      char          rcvbuf&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;MAX_IP_SIZE&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      char          rcvbuf&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;MAX_IP_SIZE&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      WSABUF        wbuf;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      WSABUF        wbuf;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff::1.12:old-30824:rev-84247 --&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=ComputerNetworkClass/Report2006/PacketAnalyzer&amp;diff=30824&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=ComputerNetworkClass/Report2006/PacketAnalyzer&amp;diff=30824&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
= 추가 요구사항 = &lt;br /&gt;
* 홈페이지 나온 내용.&lt;br /&gt;
패킷분석기는 다음 사항을 최소한 구현하여야 함.&lt;br /&gt;
&lt;br /&gt;
# 선택적 capture&lt;br /&gt;
* 수신자 주소 등에 따라 원하는 패킷만 분석&lt;br /&gt;
# IP 헤더의 graphical한 표시&lt;br /&gt;
* 리스트에서 하나의 패킷을 선택하면 IP 헤더를 분석해서 보여주는 기능&lt;br /&gt;
# ethereal의 기능 중 1개 또는 새로운 기능을 한가지 구현&lt;br /&gt;
* 예, TCP connection 설정과정 분석&lt;br /&gt;
&lt;br /&gt;
이상의 기능이 동작하는 것을 반드시 보여야 함.&lt;br /&gt;
* 이런, -_-; 할게 늘어버렸넹&lt;br /&gt;
네트워크 숙제를 하란 건지 GUI코딩을 하란 건지...&lt;br /&gt;
* ㅋㅋ 그러게 잘짜야지... ㅋㅋㅋ - &amp;amp;#91;eternalbleu&amp;amp;#93;&lt;br /&gt;
&lt;br /&gt;
= WSAIoctl =&lt;br /&gt;
WSAIoctl 은 소켓이나 트랜스포트 계층 프로토콜, 통신 시스템의 구성과 관련된 사항을 설정하거나 설정값을 가져오기위해서 만들어졌다.&lt;br /&gt;
WSA prefix 를 가진 함수의 경우 대부분 Winsock 2에서 제공 되기 시작한 것이며, 이 WSAIoctl 역시도 윈속 2에서 지원된다.&lt;br /&gt;
네트워크의 3번째 프로젝트를 하기위해서는 SIO_RCVALL 라는 옵션을 설정하여 사용할 줄 알아야한다. 유사한 옵션으로는 &lt;br /&gt;
SIO_RCVALL_IGMPMCAST, SIO_RCVALL_MCAST 가있다. &lt;br /&gt;
자세한 사항은 MSDN 혹은 Network Programming For Microsoft Windows 를 참조하기 바란다.&lt;br /&gt;
&lt;br /&gt;
※ 윈도우 소켓 프로그래밍을 위해서는 윈속 라이브러리를 같이 linking 해야하며, WSActrl 을 사용하기 위해서는 winsock2 라이브러리인 ws2_32.lib 를 포함해야한다.&lt;br /&gt;
 #include &amp;amp;lt;mstcpip.h&amp;amp;gt;&lt;br /&gt;
※  &amp;#039;SIO_RCVALL&amp;#039; : undeclared identifier 에러가 뜰 경우에 아래 코드를 추가 한다.&lt;br /&gt;
 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)&lt;br /&gt;
&lt;br /&gt;
= Sample Code =&lt;br /&gt;
 int _cdecl main(int argc, char **argv)&lt;br /&gt;
 {&lt;br /&gt;
     SOCKET        s;&lt;br /&gt;
     WSADATA       wsd;&lt;br /&gt;
     SOCKADDR_IN   if0;&lt;br /&gt;
     int           ret,&lt;br /&gt;
                   count;&lt;br /&gt;
     unsigned int  optval;&lt;br /&gt;
     DWORD         dwBytesRet,&lt;br /&gt;
                   dwFlags,&lt;br /&gt;
                   nproc;&lt;br /&gt;
     char          rcvbuf[MAX_IP_SIZE];&lt;br /&gt;
     WSABUF        wbuf;&lt;br /&gt;
 &lt;br /&gt;
     // Load Winsock&lt;br /&gt;
     //&lt;br /&gt;
     if (WSAStartup(MAKEWORD(2,2), &amp;amp;amp;wsd) != 0)&lt;br /&gt;
     {&lt;br /&gt;
         printf(&amp;quot;WSAStartup() failed: %d\n&amp;quot;, GetLastError());&lt;br /&gt;
         return -1;&lt;br /&gt;
     }&lt;br /&gt;
     // Parse the command line&lt;br /&gt;
     //&lt;br /&gt;
     ValidateArgs(argc, argv);&lt;br /&gt;
     if (bFilter)&lt;br /&gt;
     {&lt;br /&gt;
         printf(&amp;quot;Source Port: %d\n&amp;quot;, usSourcePort);&lt;br /&gt;
         printf(&amp;quot;Dest   Port: %d\n&amp;quot;, usDestPort);&lt;br /&gt;
     }&lt;br /&gt;
     // Create a raw socket for receiving IP datagrams&lt;br /&gt;
     //&lt;br /&gt;
     s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);&lt;br /&gt;
     if (s == INVALID_SOCKET)&lt;br /&gt;
     {&lt;br /&gt;
         printf(&amp;quot;WSASocket() failed: %d\n&amp;quot;, WSAGetLastError());&lt;br /&gt;
         return -1;&lt;br /&gt;
     }&lt;br /&gt;
     // Get an interface to read IP packets on&lt;br /&gt;
     //&lt;br /&gt;
     if (GetInterface(s, &amp;amp;amp;if0, dwInterface) != 0)&lt;br /&gt;
     {&lt;br /&gt;
         printf(&amp;quot;Unable to obtain an interface\n&amp;quot;);&lt;br /&gt;
         return -1;&lt;br /&gt;
     }&lt;br /&gt;
     printf(&amp;quot;Binding to IF: %s\n&amp;quot;, inet_ntoa(if0.sin_addr));&lt;br /&gt;
     //&lt;br /&gt;
     // This socket MUST be bound before calling the ioctl&lt;br /&gt;
     //&lt;br /&gt;
     if0.sin_family = AF_INET;&lt;br /&gt;
     if0.sin_port = htons(0);&lt;br /&gt;
 &lt;br /&gt;
     if (bind(s, (SOCKADDR *)&amp;amp;amp;if0, sizeof(if0)) == SOCKET_ERROR)&lt;br /&gt;
     {&lt;br /&gt;
         printf(&amp;quot;bind() failed: %d\n&amp;quot;, WSAGetLastError());&lt;br /&gt;
         return -1;&lt;br /&gt;
     }&lt;br /&gt;
     //&lt;br /&gt;
     // Set the SIO_RCVALLxxx ioctl&lt;br /&gt;
     //&lt;br /&gt;
     optval = 1;&lt;br /&gt;
     if (WSAIoctl(s, SIO_RCVALL, &amp;amp;amp;optval, sizeof(optval),&lt;br /&gt;
             NULL, 0, &amp;amp;amp;dwBytesRet, NULL, NULL) == SOCKET_ERROR)&lt;br /&gt;
     {&lt;br /&gt;
         printf(&amp;quot;WSAIotcl(%d) failed; %d\n&amp;quot;, dwIoControlCode,&lt;br /&gt;
             WSAGetLastError());&lt;br /&gt;
         return -1;&lt;br /&gt;
     }&lt;br /&gt;
     // Start receiving IP datagrams until interrupted&lt;br /&gt;
     // &lt;br /&gt;
     count = 0;&lt;br /&gt;
     while (1)&lt;br /&gt;
     {&lt;br /&gt;
         wbuf.len = MAX_IP_SIZE;&lt;br /&gt;
         wbuf.buf = rcvbuf;&lt;br /&gt;
         dwFlags  = 0;&lt;br /&gt;
 &lt;br /&gt;
         ret = WSARecv(s, &amp;amp;amp;wbuf, 1, &amp;amp;amp;dwBytesRet, &amp;amp;amp;dwFlags, NULL, NULL);&lt;br /&gt;
         if (ret == SOCKET_ERROR)&lt;br /&gt;
         {&lt;br /&gt;
             printf(&amp;quot;WSARecv() failed: %d\n&amp;quot;, WSAGetLastError());&lt;br /&gt;
             return -1;&lt;br /&gt;
         }&lt;br /&gt;
         // Decode the IP header&lt;br /&gt;
         //&lt;br /&gt;
     }&lt;br /&gt;
     // Cleanup&lt;br /&gt;
     //&lt;br /&gt;
     closesocket(s);&lt;br /&gt;
     WSACleanup();&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
상기와 같이 기존의 서버 프로그램과 다른 점은 별로 없다. (Listen과 accept가 없네요. WSAIoctrl에서 다 처리하는건지...) 단지 소켓을 ioctrl 로 조정해서 ip 수준에서 올라오는 패킷을 기존과 다르게 처리할 뿐이다.&lt;br /&gt;
SIO_RCVALL 을 통해서 NIC를 통해 올라오는 모든 패킷의 캡쳐가 가능하다. NIC를 통해 나가는 패킷을 캡쳐하지 못하는 듯 하다.&lt;br /&gt;
&lt;br /&gt;
아마도 listen, accept 가 패킷 필터링을 하는 것으로 보이는데 dst 상관없이 무조겁 application 까지 올라오니깐 필요없는 것이 아닐까? 그런 생각하고 있음. -_- - &amp;amp;#91;eternalbleu&amp;amp;#93;&lt;br /&gt;
&lt;br /&gt;
= 참고 =&lt;br /&gt;
* MFC 각 데이터 타입 크기&lt;br /&gt;
Type Size &lt;br /&gt;
bool 1 byte &lt;br /&gt;
char, unsigned char, signed char 1 byte &lt;br /&gt;
short, unsigned short 2 bytes &lt;br /&gt;
int, unsigned int 4 bytes &lt;br /&gt;
__intn 1, 2, 4, or 8 bytes depending on the value of n. __intn is Microsoft-specific. &lt;br /&gt;
long, unsigned long 4 bytes &lt;br /&gt;
float 4 bytes &lt;br /&gt;
double 8 bytes &lt;br /&gt;
long double1 8 bytes &lt;br /&gt;
long long Equivalent to __int64. &lt;br /&gt;
&lt;br /&gt;
= 데이터 변환 =&lt;br /&gt;
const char* szIpAddr to DWORD ipvalue&lt;br /&gt;
inet_addr() :&lt;br /&gt;
&lt;br /&gt;
Unsigned short interger 변환 (2바이트 체계) &lt;br /&gt;
htons() : host-to-network 바이트 변환 &lt;br /&gt;
ntohs() : network-to-host 바이트 변환 &lt;br /&gt;
&lt;br /&gt;
Unsigned long interger 변환 (4바이트 체계) &lt;br /&gt;
htonl() : host-to-network 바이트 변환 &lt;br /&gt;
ntohl() : network-to-host 바이트 변환 &lt;br /&gt;
&lt;br /&gt;
= 추천 개발 과정 =&lt;br /&gt;
(1) 콘솔로 캡쳐기, 필터, 컨테이너 클래스를 구성한다. &lt;br /&gt;
     필터기는 가능하면 propery 를 설정해서 동작하도록 구성한다.&lt;br /&gt;
(2) MFC, VB 등을 이용해서 GUI 부분을 짠다.  (핵심은 리포트 모듈 작성)&lt;br /&gt;
     컨테이너와 리스트 컨트롤을 옵저버 패턴으로 연결할 것을 염두에 둔다.&lt;br /&gt;
     캡쳐기의 동작으로 인한 UI 딜레이 현상을 막기위해서 쓰레드를 이용.&lt;br /&gt;
(3) 만들어진 front-end, back-end 를 통합한다.&lt;br /&gt;
     리포트 모듈을 리스트 컨트롤과 옵저버 패턴 혹은 이벤트 드리븐으로 연동&lt;br /&gt;
&lt;br /&gt;
= postscript =&lt;br /&gt;
일단 캡쳐기만 완성하니 그야말로 일사천리로 풀리는데 -_-; 귀차니즘이 발동하는구만.. 쿨럭  - &amp;amp;#91;eternalbleu&amp;amp;#93;&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>