목록C++ (67)
나만의 작은 도서관

목차Select 모델의 문제점WSAEventSelect 모델의 특징WSAEventSelect 모델을 이용한 echo 서버 만들기WSAEventSelect 모델의 문제점깃헙 코드Select 모델의 문제점Select 모델은 기존의 블로킹/논블로킹 방식에서 소켓 작업이 진행될 수 없는 상황에서도 진행하려는 문제를 해결하기 위해 사용하였다. 하지만 1) 매 루프마다 fd_set에 소켓을 등록하고 select() 함수가 지우는 과정을 반복한다는 점, 2) select() 함수는 동기 방식을 따른다는 점과 같은 문제점이 있었다. Select모델의 장점을 가져가면서 위와 같은 문제점을 개선한 모델이 바로 WSAEventSelect 모델이다.WSAEventSelect 모델의 특징WSAEventSelect() 함수가 ..

목차이전 블로킹/논블로킹 방식의 문제점Select 모델의 특징Select 모델 동작 과정Select 모델을 이용한 echo 서버 만들기Select 모델의 문제점깃헙 코드이전 블로킹/논블로킹 방식의 문제점이전 블로킹/논블로킹 방식에는 서로 다른 이유로 서버의 성능을 저하시키는 구조적 문제가 있었다. (블로킹 방식에 대한 정리 글은 여기, 논블로킹 방식에 대한 정리 글은 여기를 참고하면 된다.) 각 방식의 구조적 문제는 다음과 같다.블로킹 방식: 소켓 함수(recv(), send() 등)를 호출하면, 해당 작업이 완료될 때까지 호출한 스레드는 무한정 기다려야 한다.논블로킹 방식: 소켓 함수(recv(), send() 등)를 호출하면, 해당 작업이 완료되었는지 반복적으로 확인해야 한다.결국 블로킹 방식을 사..

목차블로킹 방식의 문제점논블로킹 방식으로 echo 서버 코드 바꾸기결론깃헙 코드블로킹 방식의 문제점블로킹 함수를 호출 시, 함수 내 작업이 완료되기 전까지 호출자(caller)는 작업을 멈추고 대기하게 된다. 이러한 방식의 문제점은 함수의 작업을 하는동안 함수의 결과가 나오는 동안 처리해도 되는 작업들을 처리할 수 없다는 것이다. 기존의 TCP/UDP echo 서버에서 사용한 블로킹 함수는 다음과 같다.accept -> 접속한 클라가 있을 때까지 블로킹connect -> 서버에 접속 될 때까지 블로킹send, sendto -> 요청한 데이터를 송신 버퍼에 복사될 때까지 블로킹recv, recvfrom -> 수신 버퍼에 도착한 데이터가 있고, 이를 유저레벨 버퍼에 복사될 때까지 블로킹즉, 위 함수들을 실행..
목차소켓 옵션 get, setSO_KEEPALIVESO_LINGER::shutdown()SO_SNDBUF, SO_RCVBUFSO_REUSERADDRTCP_NODELAY소켓 옵션 get, set소켓 옵션은 클라이언트-서버가 통신할 때 발생하는 특정 상황을 어떻게 대응할 것인지 설정하기위해 사용한다. 설정된 옵션을 가져오기 위해서는 getsockopt() 함수를, 옵션을 설정하기 위해선 setsockopt() 함수를 사용하면된다. getsockopt() 함수와 setsockopt() 함수는 동일한 인자를 받으며 총 5개의 인자를 넣어줘야한다. setsockopt() 함수를 보면 다음과 같이 생겼다.int setsockopt( [in] SOCKET s, [in] int level, ..

목차UDP echo 서버 만들기echo 서버에 데이터 전송해보기(Unconnected UDP)echo 서버에 데이터 전송해보기(Connected UDP)깃헙코드UDP echo 서버 만들기 이번에는 TCP가 아닌, UDP를 이용한 echo 서버를 만들어 보도록 하겠다. Winsock 초기화, 소켓 생성Winsock을 사용하려면 항상 초기화를 해줘야하기 때문에 Wincosk 초기화를 하고, 통신을 위한 소켓을 생성한다. 이부분은 TCP때에서 SOCK_STREAM -> SOCK_DGRAM 변경을 제외한 다른 부분은 동일하다.// Winsock 초기화WSAData wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaDa..

목차echo 서버 만들기echo 서버에 데이터 전송해 보기send(), recv()의 특징깃헙 코드echo 서버 만들기echo 서버란 클라이언트가 전송해 주는 데이터를 그대로 되돌려주는 서버이다. echo 서버를 만들기 위해 클라이언트가 전송한 데이터를 받는 recv(), 받은 데이터를 재전송해 주는 send()를 순서대로 사용한다. +) 클라이언트, 서버 예제 코드들은 이전 글들에서 작성한 코드 위에서 작성되었다. 데이터 수신하기: recv()recv() 함수를 이용해 클라이언트가 전송한 데이터를 받는다. recv() 함수를 사용하기 위해서는 4가지 인자가 필요한데 각각 다음과 같다.recv( _In_ SOCKET s, _Out_writes_bytes_to_(len, return) __out..