<?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=WinSock</id>
	<title>WinSock - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=WinSock"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=WinSock&amp;action=history"/>
	<updated>2026-05-15T00:03:47Z</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=WinSock&amp;diff=40299&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:28, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=WinSock&amp;diff=40299&amp;oldid=prev"/>
		<updated>2021-02-07T05:28:26Z</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;Windows Socket API. Win32 API 에 기본적으로 지원한다.&lt;br /&gt;
&lt;br /&gt;
일반적인 버클리 소켓 스타일과 Windows 자체 스타일의 비동기소켓 (윈도우 메세지를 이용하는 방법, IOCP) API 를 제공해준다.&lt;br /&gt;
&lt;br /&gt;
다음은 화일보내고 받기 관련 Winsock API 간단 예제. (옛날 예제삼아 만든 소스여서 직관적이지가 않긴 하군 -_-; 그냥 이해의 차원정도)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 보내기 소스 (서버) ===&lt;br /&gt;
서버의 경우 1 user 1 thread 임.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;amp;lt;winsock2.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;windows.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdio.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;process.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 DWORD WINAPI Threading (LPVOID args)&lt;br /&gt;
 {&lt;br /&gt;
 	SOCKET* pSocket = (SOCKET*)args;&lt;br /&gt;
 	SOCKET socket = *pSocket;&lt;br /&gt;
 	HANDLE hFileIn;&lt;br /&gt;
 	char szBuffer[8192]=&amp;quot;&amp;quot;;&lt;br /&gt;
 	DWORD nRead, nWrite, i;&lt;br /&gt;
 	DWORD dwLow, dwHigh;&lt;br /&gt;
 	int nSended;&lt;br /&gt;
 &lt;br /&gt;
 	hFileIn = CreateFile (&amp;quot;d:\test.mp3&amp;quot;, GENERIC_READ, FILE_SHARE_READ,&lt;br /&gt;
 		NULL, OPEN_EXISTING, NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 //	send (*pSocket, &amp;quot;Data&amp;quot;, 5, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	dwLow = GetFileSize (hFileIn, &amp;amp;amp;dwHigh);&lt;br /&gt;
 &lt;br /&gt;
 	for (i=0;i&amp;amp;lt;dwLow;) {&lt;br /&gt;
 		SetFilePointer (hFileIn, i, NULL, FILE_BEGIN);&lt;br /&gt;
 		ReadFile (hFileIn, szBuffer, sizeof (szBuffer), &amp;amp;amp;nRead, NULL);&lt;br /&gt;
 		nSended = send (socket, szBuffer, nRead, NULL);&lt;br /&gt;
 		i+= max (0, nSended);&lt;br /&gt;
 &lt;br /&gt;
 		if (nSended == SOCKET_ERROR) {&lt;br /&gt;
 			printf (&amp;quot;Error : %d n&amp;quot;, WSAGetLastError ());&lt;br /&gt;
 		}&lt;br /&gt;
 		else {&lt;br /&gt;
 			printf (&amp;quot;Current : %d / %d (%d)n&amp;quot;, dwLow, i, nSended);&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		Sleep (100);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	CloseHandle (hFileIn);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main (void)&lt;br /&gt;
 {&lt;br /&gt;
 	WSADATA wsaData;&lt;br /&gt;
 	sockaddr_in local, from;&lt;br /&gt;
 	SOCKET socketListen;&lt;br /&gt;
 	SOCKET socketClient;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	WSACleanup ();&lt;br /&gt;
 	DWORD dwTemp;&lt;br /&gt;
 &lt;br /&gt;
 	if (WSAStartup (0x202, &amp;amp;amp;wsaData) == SOCKET_ERROR) {&lt;br /&gt;
 		printf (&amp;quot;error.. %dn&amp;quot;, WSAGetLastError ());&lt;br /&gt;
 		WSACleanup ();&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	local.sin_family = AF_INET;&lt;br /&gt;
 	local.sin_addr.s_addr = INADDR_ANY;&lt;br /&gt;
 	local.sin_port = htons (5000);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	socketListen = socket (AF_INET, SOCK_STREAM, IPPROTO_IP);&lt;br /&gt;
 	if (socketListen == INVALID_SOCKET) {&lt;br /&gt;
 		printf (&amp;quot;create socket error.. %dn&amp;quot;, WSAGetLastError ());&lt;br /&gt;
 		WSACleanup ();&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	if (bind (socketListen, (sockaddr *)&amp;amp;amp;local, sizeof (local)) == SOCKET_ERROR) {&lt;br /&gt;
 		printf (&amp;quot;bind error.. %dn&amp;quot;, WSAGetLastError ());&lt;br /&gt;
 		WSACleanup ();&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	if (listen (socketListen, 5) == SOCKET_ERROR) {&lt;br /&gt;
 		printf (&amp;quot;listen error.. %dn&amp;quot;, WSAGetLastError ());&lt;br /&gt;
 		WSACleanup ();&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	BOOL bFlag = TRUE;&lt;br /&gt;
 &lt;br /&gt;
 	WSAEVENT hEvent = WSACreateEvent ();&lt;br /&gt;
 	WSAEVENT hEvent2 = WSACreateEvent ();&lt;br /&gt;
 	WSAEVENT Eventarry[2];&lt;br /&gt;
 &lt;br /&gt;
 	Eventarry[0] = hEvent;&lt;br /&gt;
 	Eventarry[1] = hEvent2;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	WSANETWORKEVENTS NetworkEvents;&lt;br /&gt;
 	DWORD WaitStatus;&lt;br /&gt;
 	int addlen = sizeof (from);&lt;br /&gt;
 &lt;br /&gt;
 	WSAEventSelect (socketListen, hEvent, FD_ALL_EVENTS);&lt;br /&gt;
 	printf (&amp;quot;Waiting.. n&amp;quot;);&lt;br /&gt;
 	while (bFlag) {&lt;br /&gt;
 		WaitStatus = WSAWaitForMultipleEvents (2, Eventarry, FALSE, 1000, FALSE);&lt;br /&gt;
 &lt;br /&gt;
 		if (WaitStatus == WSA_WAIT_EVENT_0) {&lt;br /&gt;
 			if (WSAEnumNetworkEvents (socketListen, hEvent, &amp;amp;amp;NetworkEvents) != 0) {&lt;br /&gt;
 				printf (&amp;quot;Error.... %dn&amp;quot;, GetLastError ());&lt;br /&gt;
 				bFlag = 0;&lt;br /&gt;
 			}&lt;br /&gt;
 &lt;br /&gt;
 			if (NetworkEvents.lNetworkEvents &amp;amp;amp; FD_ACCEPT) {&lt;br /&gt;
 				if (NetworkEvents.iErrorCode [FD_ACCEPT_BIT] == 0) {&lt;br /&gt;
 					socketClient = accept (socketListen, (sockaddr *)&amp;amp;amp;from, &amp;amp;amp;addlen);&lt;br /&gt;
 					printf (&amp;quot;Accepted... !n&amp;quot;);&lt;br /&gt;
 					//send (socketClient, &amp;quot;hugugu~rn&amp;quot;, 9, NULL);&lt;br /&gt;
 					CreateThread (NULL, NULL, Threading, &amp;amp;amp;socketClient, NULL, &amp;amp;amp;dwTemp);&lt;br /&gt;
 					WSAEventSelect (socketClient, hEvent2, FD_ALL_EVENTS);&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 &lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		if (WaitStatus == (WSA_WAIT_EVENT_0 + 1) ) {&lt;br /&gt;
 			if (WSAEnumNetworkEvents (socketClient, hEvent2, &amp;amp;amp;NetworkEvents) != 0) {&lt;br /&gt;
 				printf (&amp;quot;Error.... %dn&amp;quot;, GetLastError ());&lt;br /&gt;
 //				bFlag = 0;&lt;br /&gt;
 			}&lt;br /&gt;
 /*&lt;br /&gt;
 			if (NetworkEvents.lNetworkEvents &amp;amp;amp; FD_READ) {&lt;br /&gt;
 				DWORD dwDataReaded;&lt;br /&gt;
 				char* szBuffer;&lt;br /&gt;
 				printf (&amp;quot;Data Received... n&amp;quot;);&lt;br /&gt;
 				ioctlsocket (socketClient, FIONREAD, &amp;amp;amp;dwDataReaded);&lt;br /&gt;
 				szBuffer = (char *)LocalAlloc (LPTR, dwDataReaded);&lt;br /&gt;
 				recv (socketClient, szBuffer, dwDataReaded, NULL);&lt;br /&gt;
 				printf (&amp;quot;Data : %s (%d)n&amp;quot;, szBuffer, dwDataReaded);&lt;br /&gt;
 				LocalFree (szBuffer);&lt;br /&gt;
 			}&lt;br /&gt;
 */&lt;br /&gt;
 			if (NetworkEvents.lNetworkEvents &amp;amp;amp; FD_CLOSE) {&lt;br /&gt;
 				closesocket (socketClient);&lt;br /&gt;
 				printf (&amp;quot;closed... !n&amp;quot;);&lt;br /&gt;
 //				bFlag = 0;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	printf (&amp;quot;Program end.. n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 	WSACloseEvent (hEvent);&lt;br /&gt;
 	WSACloseEvent (hEvent2);&lt;br /&gt;
 	WSACleanup ();&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 받기 소스 (클라이언트) ===&lt;br /&gt;
 #include &amp;amp;lt;winsock2.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;windows.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdio.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main (void)&lt;br /&gt;
 {&lt;br /&gt;
 	WSADATA wsaData;&lt;br /&gt;
 	sockaddr_in local, from;&lt;br /&gt;
 	SOCKET socketClient;&lt;br /&gt;
 	SOCKADDR_IN    ServerAddress; //소켓의 주소&lt;br /&gt;
 	int i=0;&lt;br /&gt;
 &lt;br /&gt;
 	int nSize;&lt;br /&gt;
 &lt;br /&gt;
 	WSACleanup ();&lt;br /&gt;
 	DWORD dwTemp;&lt;br /&gt;
 	HANDLE hFileOut;&lt;br /&gt;
 	DWORD nWrite;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	if (WSAStartup (0x202, &amp;amp;amp;wsaData) == SOCKET_ERROR) {&lt;br /&gt;
 		printf (&amp;quot;error.. %dn&amp;quot;, WSAGetLastError ());&lt;br /&gt;
 		WSACleanup ();&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	char szCommand[8]=&amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	char szHostName[40];&lt;br /&gt;
 	gethostname(szHostName, sizeof(szHostName));&lt;br /&gt;
 	HOSTENT FAR* lphostent = ::gethostbyname(szHostName);&lt;br /&gt;
 	printf (&amp;quot;IP : %s n&amp;quot;,inet_ntoa(*((struct in_addr*)lphostent-&amp;amp;gt;h_addr)));&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	socketClient = socket (AF_INET, SOCK_STREAM, IPPROTO_IP);&lt;br /&gt;
 	if (socketClient == INVALID_SOCKET) {&lt;br /&gt;
 		printf (&amp;quot;create socket error.. %dn&amp;quot;, WSAGetLastError ());&lt;br /&gt;
 		WSACleanup ();&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	ServerAddress.sin_family = AF_INET;&lt;br /&gt;
 	//IP주소값. INADDR_ANY는 아무거나입니다. ^^;&lt;br /&gt;
 	ServerAddress.sin_addr.s_addr = inet_addr( &amp;quot;127.0.0.1&amp;quot; );&lt;br /&gt;
 	ServerAddress.sin_port = htons( 1002 );  //포트번호&lt;br /&gt;
 &lt;br /&gt;
 	connect (socketClient, (struct sockaddr*)&amp;amp;amp;ServerAddress, sizeof (ServerAddress));&lt;br /&gt;
 &lt;br /&gt;
 	WSAEVENT hEvent = WSACreateEvent ();&lt;br /&gt;
 &lt;br /&gt;
 	WSANETWORKEVENTS NetworkEvents;&lt;br /&gt;
 	DWORD WaitStatus;&lt;br /&gt;
 &lt;br /&gt;
 	WSAEventSelect (socketClient, hEvent, FD_ALL_EVENTS);&lt;br /&gt;
 	hFileOut = CreateFile (&amp;quot;testdata.mp3&amp;quot;, GENERIC_WRITE, FILE_SHARE_READ,&lt;br /&gt;
 		NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	while (1) {&lt;br /&gt;
 		WaitStatus = WSAWaitForMultipleEvents (1, &amp;amp;amp;hEvent, FALSE, 10, FALSE);&lt;br /&gt;
 &lt;br /&gt;
 		if (WaitStatus == WSA_WAIT_EVENT_0) {&lt;br /&gt;
 			if (WSAEnumNetworkEvents (socketClient, hEvent, &amp;amp;amp;NetworkEvents) != 0) {&lt;br /&gt;
 				printf (&amp;quot;Error.... %dn&amp;quot;, GetLastError ());&lt;br /&gt;
 			}&lt;br /&gt;
 &lt;br /&gt;
 			if (NetworkEvents.lNetworkEvents &amp;amp;amp; FD_CONNECT) {&lt;br /&gt;
 				if (NetworkEvents.iErrorCode [FD_CONNECT_BIT] == 0) {&lt;br /&gt;
 					printf (&amp;quot;Connect... !n&amp;quot;);&lt;br /&gt;
 					// TEST_FILE_REQUARE			0xF0&lt;br /&gt;
 					szCommand[0] = 0xF0;&lt;br /&gt;
 					send (socketClient, szCommand, 8, NULL);&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 &lt;br /&gt;
 			if (NetworkEvents.lNetworkEvents &amp;amp;amp; FD_READ) {&lt;br /&gt;
 				DWORD dwDataReaded;&lt;br /&gt;
 				char* szBuffer;&lt;br /&gt;
 				ioctlsocket (socketClient, FIONREAD, &amp;amp;amp;dwDataReaded);&lt;br /&gt;
 				szBuffer = (char *)LocalAlloc (LPTR, dwDataReaded);&lt;br /&gt;
 				recv (socketClient, szBuffer, dwDataReaded, NULL);&lt;br /&gt;
 				WriteFile (hFileOut, szBuffer, dwDataReaded, &amp;amp;amp;nWrite, NULL);&lt;br /&gt;
 				i+= dwDataReaded;&lt;br /&gt;
 				printf (&amp;quot;Data Received... %d (%d)n&amp;quot;, i, dwDataReaded);&lt;br /&gt;
 &lt;br /&gt;
 				LocalFree (szBuffer);&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	closesocket (socketClient);&lt;br /&gt;
 	WSACleanup ();&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
[[도구분류]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>