본문 바로가기

Programming

Write log to file - Code WSLog.h #pragma once #define MAX_MSG_LEN 4096 #define MAX_VA_LEN 3072 #define MAX_DIRPATH_LEN 1024 #define MAX_ABSOLUTEPATH_LEN 2048 #define MAX_FILENAME 1024 #define UM_WRITELOG WM_USER+6654 #define UM_TERMINATE_THREAD WM_USER+2 #define LOG_DEBUG 1 #define LOG_INFO 2 #define LOG_WARNING 3 #define LOG_ERROR 4 #define LOGOUT(int, arg,...) DbgMsg(int, _T("[%s] ") arg, _T(__FUNCTION__), ##__VA_ARGS.. 더보기
IOCP model(Chat Server) - Code SockIOCP.h #pragma once #include #pragma comment(lib,"ws2_32") DWORD WINAPI ThreadCompletion(LPVOID pParam); typedef struct _USERSESSION{ SOCKET hSocket; SOCKADDR_IN clientAddr; }USERSESSION; typedef struct _PERIODATA{ OVERLAPPED ov; WSABUF wsabuf; char buffer[1024]; bool isRecv; }PERIODATA; class SockIOCP { public: SockIOCP(void); ~SockIOCP(void); public: HANDLE m_hIOCP; int m_nThreadCount; SOC.. 더보기
IOCP model(Server) - Idea Overlapped IO 개념: 기본적으로 IO는 동기방식이다. ReadFile()하면 디스크에서 파일이 다 읽어질때까지 CPU는 대기한다. 이게 성능저하를 초래하기 때문에 비동기로 IO를 처리하는 방법인 Overlapped IO이다. 비동기로 여러번 데이터를 전송하면 데이터 전송이 중첩된다는 의미로 Overlapped형태라고 한다. 원리: 비동기 방식으로 WSASend()를 호출하면 이 IO처리의 책임이 쓰레드에서 Device Driver로 넘어간다. 즉 IO처리는 Driver가 담당하고 쓰레드는 다른 작업을 계쏙 진행할 수 있다는 것이다. Device Driver는 IO처리가 끝나면 이를 다시 쓰레드에 알려줘야 하는데 OVERLAPPED 구조체에 있는 이벤트 객체를 통해서 알려주기도 하고 아니면 지정.. 더보기
Basic model(Chat Client) - Code ConsoleChatClient.cpp #include "stdafx.h" #include #pragma comment(lib,"ws2_32") DWORD WINAPI ReceiveThread(LPVOID pParam) { //무한 수신을 해야한다. 종료되지 말고. SOCKET hSocket = (SOCKET)pParam; char szBuffer[32] = {0,}; while(1) //종료되지 말아야 하니까 while루프.. { memset(szBuffer,0,sizeof(szBuffer)); ::recv(hSocket,szBuffer,sizeof(szBuffer),0); //여기도 recv함수가 블라킹이니까 한번 받고 한바퀴 돌고 다시 대기 printf("From Server: %s\n", szBu.. 더보기
Basic model(Client) - Idea WSAStartup(): 윈속 초기화 함수 WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수. WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수. socket(): 소켓 생성 함수 소켓을 생성하고 사용할 프로토콜을 지정한다. SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다. bind(): src ip와 port 설정 Client는 서버와 달리 일반적으로 bind()를 호출하지 않는다. 그러면 OS가 자동으로 src ip와 port를 지정해준다. 다만 Client도 특별한 경우 src ip와 port를 지정하고 싶다면 bind()를 호출하면 된다. connect(): 서버로의 연결 시도.. 더보기
Basic model(Chat Server) - Code ConsoleChatServer.cpp #include "stdafx.h" #include #pragma comment(lib,"ws2_32") #include #include #include using namespace std; std::list socket_list; //동적배열 std::list::iterator it;//동적배열 접근자 DWORD WINAPI CommunicationThread(LPVOID pParam); DWORD WINAPI ConnectionThread(LPVOID pParam); DWORD WINAPI ConnectionThread(LPVOID pParam) //접속처리용 스레드 { SOCKET hSocket = (SOCKET)pParam; //5. 서버 소켓을 Accept.. 더보기
Basic model(Server) - Idea WSAStartup(): 윈속 초기화 함수 WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수. WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수. socket(): 소켓 생성 함수 소켓을 생성하고 사용할 프로토콜을 지정한다. SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다. bind(): 소켓의 local IP주소와 local port를 지정한다. int bind(SOCKET s, const struct sockaddr *name, int namelen); 함수 사용. 두번째 인자는 SOCKADDR_IN 구조체에 값을 담아 SOCKADDR*형으로 캐스팅하여 전달한다. listen():.. 더보기
Socket programming Basic model - 개요 - 서비스를 요청하는쪽을 client, 요청된 서비스를 처리하는 쪽을 server라고 부른다. TCP 서버/클라이언트 로직 순서 TCP서버 TCP클라이언트 socket() socket() bind() listen() accept() connect() recv() send() send() recv() closesocket() closesocket() - accept()와 connect()에서 TCP의 3way handshake(SYN, SYN/ACK, ACK)가 발생함. - 윈도우 소켓은 WS2_32.DLL을 통해 대부분의 기능이 제공된다. 이를 사용하려면 ws2_32.lib를 프로젝트에 추가해야 한다. - socket()을 본격적으로 호출하기 전에 사전작업으로 winsock초기화 작업을 해줘야 한다. W.. 더보기
TCP/IP 개요 TCI/IP 프로토콜 구조 응용계층 Telnet, FTP, HTTP, SMTP, MIME, SNMP ... 전송계층(TCP/UDP) Port사용 인터넷 계층(IP) IP주소 사용 네트워크 접근 계층(드라이버) MAC주소 사용 TCP/UDP 비교 TCP UDP 연결형 프로토콜 연결 설정 후 통신 가능 비연결형 프로토콜 연결 설정 없이 통신 가능 신뢰성 있는 데이터 전송 데이터를 재전송함 신뢰성 없는 데이터 전송 데이터를 재전송하지 않음 일대일 통신(Unicast) 일대일통신(Unicast) 일대다통신(Broadcast, multicast) 데이터 경계 구분 안함 Byte-stream 서비스 데이터 경계 구분함 Datagram 서비스 더보기
Git 원격 저장소 Git Remote관련 명령어Git clone: 원격저장소를 로컬로 복사. Git init이 필요없다.Git clone 'remote주소' myfolder: myfolder를 만들고 거기에 remote저장소 내용을 복제 및 연결 Git fork: 원격저장소의 git을 내 프로젝트로 복사하기. 원본 소스에는 fork 카운트만 올라갈 뿐 영향을 미치지 않는다. Git push: local의 repository에 commit을 한 후 이것을 remote저장소로 올림. Git push -u origin master: git push를 할 때 원격 저장(origin)의 특정 브랜치(master)를 로컬 저장소의 기본 연결 포인트로 설정. 한번만 해두면 나중에 push하면 자동으로 local의 현재 브랜치가 ori.. 더보기