728x90

Network/Windows 소켓 프로그래밍 입문에서 고성능 서버까지! 8

UDP와 브로드캐스트

UDP 프로토콜 특징 연결, 상태 개념이 없음 흐름제어 , 송/수신 보장 혹은 확인에 관한 기능 없음 개발자 스스로 tcp 구현가능하다 영상 및 게임에서 많이 쓰이게 된다. //소켓 생성. SOCK_DGRAM 타입을 사용한다! SOCKET hSocket = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (hSocket == INVALID_SOCKET) ErrorHandler("UDP 소켓을 생성할 수 없습니다."); //원격지로 메시지를 전송하는 스레드 함수. DWORD WINAPI ThreadSendto(LPVOID pParam) { //송신을 위한 UDP 소켓을 하나 더 개방한다. SOCKET hSocket = ::socket(AF_INET, SOCK_DGRAM,..

서버 성능 개선

IOCP 모델 Proactor 방식 고속 입/출력 모델 입출력이 끝날 때까지 대기를 계속하는것이 아니라 callback 처럼 입출력이 끝날시에 어떤것을 해줘! 하는 방식 비동기 I/O 통지(Callback) 구조 사용자 요청에 대한 처리 스레드 풀을 OS가 직접관리 사용자가 스레드풀을 만들어서 처리하는것이 아님 커널영역에서 사용자 메모리 영역을 공유해 불필요한 메모리 복사 방지 입/ 출력 처리시 관련 메모리에 대해 페이지 단위 Lock/Unlock Callback 함수는 사용자 모드 함수이나 커널에서 호출하며 이때마다 스위칭 VMS의 특정 메모리에 쓸 data를 쓰고 I/O request가 IOCP queue에 들어가게 되면 kernel io작업을 할때 특정 메모리를 Lock을 잡아서 오염되지 않게 하고..

파일 송/수신과 프로토콜 설계

파일 송/수신 서비스 구조 설계 파일 송/수신 프로토콜 정의 기본 헤더와 확장헤더로 나눠서 정의 기본 헤더는 이어지는 확장 헤더 를 결정하기 위한 코드 값 포함 코드 값에 따른 switch case 각 경우에 대한 함수(처리기) 및 해석 방법 적용 json으로 was에서 처리할것이 아니라면 native c++ 에서는 위와 같은 구조를 갖는게 일반적이다. send 1회 recv multiple이 일반적이다. 받을 때는 끊어내는 구조로 가야한다. 응용 프로그램 프로토콜 디자인 header에 맞는 구조체를 recv(&mcd) 로 읽어와서 Code를 읽어와서 Ext1,2,3 중 어떤 case인지 판별하여 진행하게 된다. 프로토콜이 적용된 파일 송신 서버 제작 //MYCMD 구조체의 nCode 멤버에 적용될 수 ..

파일 송/수신

기본 구조에 대한 설명 client 의 운영체제 의 수신속도 (kernel -> application ) 가 application 의 read 속도 보다 빠르면 장애가 날 확률이 높다. 파일 송신 서버 제작 (프로토콜이 없는 파일 송신) //파일송신 char byBuffer[65536];//64KB int nRead, nSent, i = 0; while ((nRead = fread(byBuffer, sizeof(char), 65536, fp)) > 0) { //파일에서 읽고 소켓으로 전송한다. //전송에 성공하더라도 nRead와 nSent 값은 다를 수 있다!!! nSent = send(hClient, byBuffer, nRead, 0); printf("[%04d] 전송된 데이터 크기: %d\n", ++..

TCP 채팅 서버 - 성능 개선

I/O 멀티플렉싱 채팅 서버로 개선 여러 입/출력 요청이 한 채널에 동시에 혼재 할 수 있는 입/출력 구조 개발자 관점에서 보면 송신과 수신이 동시에 발생하는 것 모든 입/출력은 프로세스가 아니라 OS가 주도 한다는것이 핵심 https://tonylim.tistory.com/465 비동기 I/O는 callback , Event 같은 방식으로 디스크 쓰기 가 완료되었다는 것을 알려준다. 멀티플렉싱에서는 OS가 채널에 정보가 들어오는것을 알고 있기때문에 모종의 방식으로 user에게 어떤 채널에 정보가 준비되었는지 알려주게 된다. 중첩된 파일 입/출력에서 한 파일의 여러 다른 부위에 비동기적으로 write요청을 보낼시 순차적으로 될지 알 수가 없다. I/O 멀티플렉싱 서버 - 변화 감시 //5. 소켓의 변화를..

TCP 채팅 서버 - 기본 이론

멀티스레드 채팅 서버 구조와 이론 멀티스레드 기반 에코 서버의 확장형 한 클라이언트 TCP 세션을 관리하는 개별 스레드가 클라이언트 수 만큼 존재 연결된 모든 클라이언트를 관리하기 위한 자료구조가 필요하며 스레드 동기화 보다 강도 높은 안정성이 요구됨 멀티스레드 기반 채팅 서버 //새로 연결된 클라이언트의 소켓을 리스트에 저장한다. BOOL AddUser(SOCKET hSocket) { ::EnterCriticalSection(&g_cs);//임계영역 시작 //※ 이 코드는 오직 한 스레드만 수행한다는 것이 보장된다! g_listClient.push_back( hSocket ); ::LeaveCriticalSection(&g_cs);//임계영역 끝 return TRUE; } client socket들을 ..

소켓 옵션과 필수 이론

소켓 입/출력 버퍼 bps = bit per sec pps = packet per sec mtu = 1500bytes 정도하는데 패킷을 꽉채우지 않고 pps 만 늘면 별로 좋지 않다. bps가 높아야 좋다고 볼 수 있다. Nagle algorithm = pps를 줄이고 한번에 패킷을 꽉채워서 보내자 , tcp 수준에서 기본적으로 적용되는 알고리즘 결국은 buffered i/o에서 하고자 하는것은 i/o 신호가 올때마다 매번 반응하는것이 아니라 한꺼번에 한번씩 보내자 tcp implementation 이 엄청많다. (딱히 언제까지 기다릴것인가에 대한 규약이 정해져있지않다.) //소켓의 '송신' 버퍼의 크기를 확인하고 출력한다. int nBufSize = 0, nLen = sizeof(nBufSize); i..

TCP 소켓 프로그래밍 입문

소켓의 본질에 대한 이해 소켓은 OS커널에 구현 되어 있는 프로토콜 요소에 대한 추상화된 인터페이스 장치 파일의 일종으로 이해할 수 있음 일반 파일에 대한 개념이 대부분 적용됨 TCP 상태 다이어그램과 적절한 상태 전이 파란색이 server이고 연결을 대기하고 있다가 끊길때는 client가 끊자고 해서 server는 passive close가 이뤄진다. server가 먼저 연결을 끊어버리는것은 적절한 전이 가 아니다. TCP 에코 서비스 전체 흐름 socket() -> bind() 가 끝나야 CLOSED -> LISTEN으로 변경된다. listen()을 통해 대기하다가 client 가 connect를 시도하면 server 가 accept하고 연결이 된다. socket은 server socket , acc..

728x90