#include #include #include #define BUFSIZE 4096 // ¼ÒÄÏ ÇÔ¼ö ¿À·ù Ãâ·Â ÈÄ Á¾·á void err_quit(char *msg) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR); LocalFree(lpMsgBuf); exit(-1); } // ¼ÒÄÏ ÇÔ¼ö ¿À·ù Ãâ·Â void err_display(char *msg) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf); LocalFree(lpMsgBuf); } // »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ ¼ö½Å ÇÔ¼ö int recvn(SOCKET s, char *buf, int len, int flags) { int received; char *ptr = buf; int left = len; while(left > 0){ received = recv(s, ptr, left, flags); if(received == SOCKET_ERROR) return SOCKET_ERROR; else if(received == 0) break; left -= received; ptr += received; } return (len - left); } DWORD WINAPI ProcessClient(LPVOID arg); class Cilent_Connect { private: int retval; SOCKET client_sock; // Á¢¼ÓÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏ SOCKADDR_IN clientaddr; // Á¢¼ÓÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ±¸Á¶Ã¼ char buf[BUFSIZE]; // ¹öÆÛ char filename[256]; // ÆÄÀÏ À̸§ int totalbytes; // Àü¼Û ¹ÞÀ» µ¥ÀÌÅÍ Å©±â ¹Þ±â int currbytes; // À̾î¹Þ±â¸¦ ÇÒ¶§ ÇÊ¿äÇÑ º¯¼ö, ÆÄÀÏÅ©±â°¡ ÀúÀåµÊ. void Client_Disconnect(); // ÆÄÀÏÀ» ¸ðµÎ ¹Þ¾ÒÀ¸¸é ÇØ´ç Ŭ¶óÀ̾ðÆ®¸¦ Á¾·áÇÏ´Â ÇÔ¼ö bool Client_Send_FilePosition(); // Àü¼Û ½ÃÀÛÇÒ À§Ä¡(=ÇöÀçÀÇ ÆÄÀÏ Å©±â) º¸³»±â bool Client_Recv_Filesize(); // Ŭ¶óÀ̾ðÆ®¿¡°Ô·ÎºÎÅÍ ¹ÞÀ¸·Á´Â ÆÄÀÏ »çÀÌÁ ¹Þ´Â´Ù. bool Check_File(); // ÆÄÀÏÀÌ ÀÌ¹Ì ÀÖ´ÂÁö °Ë»çÇϱâ bool File_Download(); // ÆÄÀÏ µ¥ÀÌÅÍ ¹Þ±â public: Cilent_Connect(SOCKET client) { client_sock = client; int addrlen = sizeof(clientaddr); getpeername(client_sock, (SOCKADDR*)&clientaddr, &addrlen); totalbytes = 0; // ÃʱâÈ­;; } ~Cilent_Connect() { Client_Disconnect(); // ´Ù¿î·Îµå ¿Ï·á½Ã, ¿¬°áµÈ Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ²÷°í ´Ù½Ã listen »óÅ·Î... } bool Download_Proc() { if(!Check_File()) // ¹ÞÀ¸·Á´Â ÆÄÀÏÀÌ ÀÖ´ÂÁö È®ÀÎ, ÀÖÀ¸¸é Á¢¼ÓÀ» ²÷°í listen »óÅ·Î.. return false; if(!Client_Send_FilePosition()) // ¹ÞÀ¸·Á´Â ÆÄÀÏÀÌ ¼­¹ö¿¡ ¾ø´Ù¸é, or Á¦´ë·Î ¾È¹Þ¾Ò´Ù¸é, ±×ÆÄÀÏÀÇ ¸¶Áö¸· ÁöÁ¡À» ±¸Çؼ­ Ŭ¶óÀ̾ðÆ®¿¡ º¸³½´Ù return false; if(!Client_Recv_Filesize()) // ¹ÞÀ¸·Á´Â ÆÄÀÏÀÇ Àüü Å©±â¸¦ ¹Þ´Â´Ù. return false; if(!File_Download()) // ´Ù¿î·Îµå ½ÃÀÛ return false; return true; } }; class File_Server { private: int retval; // °ø¿ë º¯¼ö ¤Ñ¤Ñ.. ´ë·« ¾î´À ÇÔ¼öÀÇ ¸®ÅÏ°ª¿¡ È°¿ë WSADATA wsa; // À©¼ÒÄÏ SOCKADDR_IN serveraddr; // ¼­¹ö ¼ÒÄÏÀÇ ±¸Á¶Ã¼ SOCKET listen_sock; // ´ë±âÁßÀÎ ¼­¹ö ¼ÒÄÏ SOCKET client_sock; // Á¢¼ÓÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏ SOCKADDR_IN clientaddr; // Á¢¼ÓÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ±¸Á¶Ã¼ bool Client_Accept(); // Ŭ¶óÀ̾ðÆ® Á¢±Ù½Ã ó¸® ÇÔ¼ö public: File_Server(char *ip, int port); // socket ¼±¾ð¿¡¼­ listen ´Ü°è±îÁö ÀÏ°ýó¸® ´Ü°è ~File_Server(); // ÇÁ·Î±×·¥ Á¾·á½Ã ¸¶¹«¸® ÀÛ¾÷ void Server_Loop(); // ¼­¹ö ·çÇÁ };