실행 함수(비동기 + 논-블로킹) WSASend 비동기 입출력 소켓 WSABUF 배열의 시작 주소 + 개수 보내고/받은 바이트 수 상세 옵션인데 0 WSAOVERLAPPED 구조체 주소값 입출력이 완료되면 OS가 호출할 콜백 함수 void CompletionRoutin() 오류 발생 시 0 아닌 값 전송 바이트 수 비동기 입출력 함수 호출 시 넘겨준 WSAOVERLAPPED 구조체의 주소값 0 비동기 입출력 함수 완료되면, 쓰레드마다 있는 APC큐(Asynchronous procedure call queue)에 일감이 쌓임. APC큐는 비동기 입출력 결과 저장을 위해 운영체제가 각 스레드에 할당하는 메모리 영역입니다. Overlapped (Completion Routine 코드 작동 방식) 비동기 입출력..
실행 함수(비동기 + 논-블로킹) WSASend 비동기 입출력 소켓 WSABUF 배열의 시작 주소 + 개수 보내고/받은 바이트 수 상세 옵션인데 0 WSAOVERLAPPED 구조체 주소값 입출력이 완료되면 OS가 호출할 콜백 함수 WSARecv Scatter-Gater AcceptEx ConnectEx WSAWaitForMultipleEvents WSAGetOverlappedResult 비동기 소켓 넘겨준 overlapped 구조체 전송된 바이트 수 비동기 입출력 작업이 끝날때까지 대기할지? (false) 비동기 입출력 작업 관련 부가 정보. 거의 사용 안함. 실행 과정 (이벤트 방식) Overlapped 함수를 건다 (WSARecv, WSASend) Overlapped 함수가 성공했는지 확인 후 → 성..
사용언어) C, C++ 2번) 명령행 인자로 숫자를 입력받아 해당 숫자만큼 서버에 연결하는 TCP 클라이언트를 MultiConnectTCPClient 이름으로 작성하시오. #pragma warning(disable:4996) #pragma comment(lib, "ws2_32.lib") #include #include #include #include #define BUFSIZE 512 #define THREADSIZE 1024 short PORTNUM = 0; char IP[10]; int total = 0; CRITICAL_SECTION cs; void err_quit(const char* msg); DWORD WINAPI SendServer(LPVOID arg); int recvn(SOCKET s, ..
WSAEventSelect 함수가 핵심 소켓과 관련된 네트워크 이벤트를 **[이벤트 객체]**를 통해 감지 이벤트 객체 관련 함수들 생성 : WSACreateEvent (수동 리셋 Manual-Reset + Non-Signaled 상태 시작) 삭제 : WSACloseEvent 신호 상태 감지 : WSAWaitForMultipleEvents count, event waitAll : 모두 기다림? 하나만 완료되어도 OK? timeout : 타임 아웃 지금은 False return : 완료된 첫번째 인덱스 구체적인 네트워크 이벤트 알아내기 : WSAEnumNetworkEvents socket eventObject : socket과 연동된 이벤트 객체 핸들을 넘겨주면, 이벤트 객체를 non-signaled ne..
문제 상황 ) 수신 버퍼에 데이터가 없는데, **read** 송신 버퍼가 꽉 찼는데, **write** Select 모델(selec함수가 핵심) 소켓 함수 호출이 성공할 시점을 미리 알 수 있다. 블로킹 소켓 : 조건이 만족되지 않아서 블로킹되는 상황 예방 논 블로킹 소켓 : 조건이 만족되지 않아서 불필요하게 반복 체크하는 상황을 예방 실행 순서 읽기[ ] 쓰기[ ] 예외(00B)[ ] 관찰 대상 등록 단) OutOfBrand는 send() 마지막 인자 MSG_OOB로 보내는 특별한 데이터 받는 쪽에서도 recv 00B 세팅을 해야 읽을 수 있음. select(readSet, writeSet, exceptSet); -> 관찰 시작 적어도 하나의 소켓이 준비되면 리턴 -> 낙오자는 알아서 제거됨 남은 소켓..
책 ) TCP/IP 윈도우 소켓 프로그래밍 지금까지 공부했던 서버는 두가지의 서버로 분류 할 수 있다. 반복서버(iterative server) 여러 클라이언트를 한번에 하나씩 처리한다. 단일 스레드로 구현하며, 시스템 자원소모가 적다. 하지만 한 클라이언트의 처리 시간이 길어지면 다른 클라이언트의 대기시간이 길어진다. (UDP 서버를 작성할때 적합) 병행 서버(concurrent server) 여러 클라이언트를 동시에 처리한다. 멀티스레드 서버가 해당되고, 한 클라이언트의 처리 시간이 길어지더라도 다른 클라이언트에 영향을 주지 않는다. 다만 스레드를 여러 개 생성하여 구현하므로 시스템 자원 소모가 많다. 이상적인 소켓 입출력 모델의 특징 가능한 많은 클라이언트가 접속할 수 있다. 서버는 각 클라이언트의..
여태껏 만들던 서버는 동기 형식의 서버로써, accept() | connect() | send() | recv() | sendto() | recvfrom() 함수 모두 호출 시 조건이 만족될 때 까지 무한정 대기하는 형식을 취합니다. 따라서 조건이 맞지 않으면 다른 행동을 할 수 없습니다. 그렇다면, 비동기 형식은 무엇이냐? 비동기 형식은 소켓 함수 호출 시 조건이 만족되지 않더라도 함수가 리턴을 하므로 중단 없이 다음 코드를 수행할 수 있습니다. 다만 조건이 만족되지 않아서 리턴하게 되면 WSAEWOULDBLOCK코드를 리턴합니다. 따라서 WSAGetLastError()를 통해서 확인을 해야 합니다. 호출 방식은 아래와 같습니다. 전체적인 예제도 참고해서 봐주시면 감사하겠습니다. Client는 기본 세..
원래 코드에 호스트이름을 입력하면 호스트의 IP주소들을 얻어서 출력하는 형식또한 추가하였습니다. 클라코드 더보기 //Client #pragma warning(disable:4996) #pragma comment(lib, "ws2_32.lib") #include #include #include #include "resource.h" #define SERVERIP "127.0.0.1" #define SERVERPORT 9000 #define BUFSIZE 512 //윈도우 프로시저 BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); //편집 함수 void DisplayText(const char* fmt, ...); //오류 출력 함수 void err_quit(cons..
- Total
- Today
- Yesterday
- 자료구조
- 드림핵
- 시스템보안
- 백준
- 야경
- 개발
- 학교
- 스레드풀
- Select모델
- 인제대학교
- 고양이
- 정보보안
- BFS
- 레지스터
- 링크드 리스트
- queue
- 알고리즘
- c++
- 보안
- 지뢰찾기
- 더블버퍼링
- 컨퍼런스
- STL
- Dreamhack
- 멀티쓰레드
- 워셜알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |