본문 바로가기

C++38

Hacker rank day17 hacker rank 30 day challange 에서 예외 처리에 대한 문제가 나왔다. 예외 처리를 제대로 해본적이 없어서 헷갈렸는데 인터넷을 보고 std::exception 클래스를 상속받아 what() 함수를 override 했다. class CustomException : public std::exception{ public: const char * what() const noexcept override { return "n and p should be non-negative"; } }; 2021. 9. 27.
Socket 4 linger TCP의 단절 감지를 위해서 사용. typedef struct linger { u_short l_onoff; u_short l_linger; } LINGER, *PLINGER, *LPLINGER; l_onoff : 0이면 해당 소켓을 닫고, Graceful Shutdown을 수행하지만 종료작업의 완료 시점은 알 수 없음 0이 아니면 해당 소켓을 열어놓음 l_linger : l_onoff가 0이 아닐때만 유효하며 l_linger가 0이 아니라면 명시된 시간동안 정상종료 되지 않으면 비정상 종료되고 버퍼의 데이터는 버려짐 l_linger가 0이면 비정상 종료되어 남아있던 데이터는 버려지며 Graceful Shutdown을 수행하지 않음 이러한 경우 FIN을 전달하지 않고 RTS를 상대 호스트로 .. 2021. 3. 2.
Socket 3 WSAIoctl 소켓의 모드를 제어하는 함수 int WSAAPI WSAIoctl( INSOCKET s, INDWORD dwIoControlCode, INLPVOID lpvInBuffer, INDWORD cbInBuffer, OUTLPVOID lpvOutBuffer, INDWORD cbOutBuffer, OUTLPDWORD lpcbBytesReturned, INLPWSAOVERLAPPED lpOverlapped, INLPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); s : 소켓 dwIoControlCode : 함수가 수행하는 연산의 제어코드 lpvInBuffer : 입력 버퍼에 대한 포인터 cbInBuffer : 입력버퍼의 크기(lpvInBuffer의 .. 2021. 2. 25.
Socket 2 WSARecv 연결된 소켓으로부터 데이터를 받을때 사용 int WSAAPI WSARecv( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); s : 연결된 소켓 lpBuffers : WSABUF 구조체의 포인터, 각 WSABUF구조체는 buffer 포인터와 길이등을 가지고 있다 dwBufferCount : lpBuffers에 사용된 WSABUF의 개수 lpNumberOfBytesRecvd : receive 과정이 끝나고 받은 .. 2021. 2. 15.
Socket 1 WSAStartup Winsock DLL을 사용하기 위해 초기화 int WSAAPI WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); mVersionRequested : Windows Sockets의 버전을 지정할때 사용 lpWSAData : WSADATA 구조체의 포인터로, Windows Sockets의 구현 정보를 받아온다 MAKEWORD(lowbyte, highbyte) : Windef.h의 매크로중 하나 WSAStartup의 결과가 0이 아니면 Winsock DLL을 사용할 수 없는 등 에러가 발생한 것 WSADATA구조체는 Windows Socket의 구현정보를 담을때 사용 WSASocketW 소켓을 만들고 특정 transport-servi.. 2021. 2. 9.
객체를 클로저 안으로 이동하려면 초기화 갈무리를 사용하라 C++11에서는 이동 전용 객체들(std::unique_ptr, std::future 등)을 클로저 안으로 들여올 수가 없다. 또한 복사는 비싸고 이동은 저렴한 객체를 클로저 안으로 들여온다면 복사보다는 이동이 적용되는 것이 바람직한데 역시 불가능하다. C++14에서는 객체를 클로저 안으로 이동하는 수단을 직접 제공한다. 이동 갈무리를 위해 새로운 갈무리 메커니즘을 도입했는데 그것을 초기화 갈무리 라고 한다. 초기화 갈무리는 람다로부터 생성되는 클로저 클래스에 속한 자료 멤버의 이름과 그 자료 멤버를 초기화하는 표현식을 지정할 수 있다. 다음은 초기화 갈무리의 한 예이다. class Widget{ public: ... bool isValidated() const; bool isProcessed() con.. 2020. 8. 6.