본문 바로가기

프로그래밍226

윈도우 소켓 ] connect() 함수의 타임아웃은 21초 connect() 함수의 타임아웃 TCP connection은 3-way-handshake에 의해 이루어지는데 클라이언트는 SYN 패킷을 전송한 이후 SYN+ACK를 수신할 때까지 대기하게 된다. 이때, 서버기기가 네트워크에 연결되어 있고 포트가 닫혀있는 경우 서버기기는 SYN+ACK 대신 RST 패킷을 보낼테니 클라이언트는 서버에 연결할 수 없다는 걸 RTT(Round Trip Time)만에 알 수 있다. 로컬네트워크에서 이 시간은 몇 밀리초이지만 인터넷에서는 그 이상이 될 수 있다. 서버기기가 네트워크에 없는 경우 클라이언트는 응답을 받지 못한채 SYN 패킷 전송을 재시도할 것이다. 이 때 재시도 횟수와 타임아웃은 운영체제의 TCP/IP protocol stack 설정값에 따라 달라질 수 있는데 윈도.. 2023. 12. 25.
윈도우 소켓 ] blocking / non-blocking 소켓 사용 시 소켓함수의 리턴 조건 recv() Blocking socket : 수신된 데이터가 없으면 블록되고, MSG_WAITALL 플래그를 사용하면 원하는 크기만큼 도착할 때까지 기다릴 수 있다. Non-blocking socket : 수신된 데이터가 없으면 WSAEWOULDBLOCK으로 즉시 리턴한다. WSAGetLastError() 함수를 사용하여 에러 코드를 확인할 수 있다. TCP / UDP 비교 : 동일하게 Blocking socket에서는 소켓 수신 버퍼에 도착한 데이터가 없으면 블록되고, 소켓 수신 버퍼에 도착한 데이터가 있을 시 이를 응용 프로그램이 제공한 버퍼에 복사한 뒤 리턴한다. send() Blocking socket : 소켓 송신 퍼버에 여유 공간이 없으면 블록되고, 응용 프로그램이 전송 요청한 데이터를 소켓 .. 2023. 12. 24.
IcmpSendEcho IcmpSendEcho 함수는 Windows 운영 체제에서 ICMP 에코 요청을 보내고 응답을 받는 데 사용되는 함수로 주로 네트워크 연결 상태를 확인하거나 호스트의 응답 시간을 측정하는 데 사용됩니다. 📝 ICMP (Internet Control Message Protocol) : 네트워크에서 발생하는 여러 상태 및 오류 메시지를 전송하는 데 사용되는 프로토콜 DWORD IcmpSendEcho( HANDLE IcmpHandle, IPAddr DestinationAddress, LPVOID RequestData, WORD RequestSize, PIP_OPTION_INFORMATION RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout .. 2023. 12. 23.
strchr, strrchr strchr 및 strrchr 함수는 C 표준 라이브러리 함수로 문자열에서 특정 문자를 찾는 데 사용되는 함수들이다. strchr 문자열 앞에서 부터 찾고 strrchr 는 뒤에서 부터 찾는다는 차이가 있다. strchr #include char *strchr(const char *str, int c); 문자열에서 특정 문자 c를 찾아 첫 번째로 등장하는 위치를 반환한다다. 만약 문자 c가 문자열에 없으면 NULL을 반환한다. 사용 예시. #include #include int main() { const char *str = "Hello, World!"; char target = ' '; // 문자열에서 ' '공백문자를 찾기 char *result = strchr(str, target); if (resu.. 2023. 12. 22.
strpbrk strpbrk char *strpbrk(const char *str1, const char *str2); str1: 검색 대상이 되는 문자열 str2: 검색할 문자들로 이루어진 문자세트 반환 값: str1에서 str2에 지정된 문자세트 중 첫 번째로 매치되는 문자의 포인터. str1, str2 둘 다 null terminated string이어야 하고 일치여부 확인시 null 문자는 고려하지 않음. 반환값이 NULL이라면 일치하는 문자를 못찾은 것. 사용 예시 #include #include int main() { // str1에서 첫번째로 나오는 모음문자 포인터를 찾음 const char *str1 = "Hello, World!"; const char *str2 = "aeiou"; char *resul.. 2023. 12. 21.
strcspn strcspn size_t strcspn(const char *str1, const char *str2); str1: 검색 대상이 되는 문자열 str2: 검색할 문자들로 이루어진 문자세트 반환 값: str1에서 str2에 지정된 문자세트 중 첫 번째로 매치되는 문자가 위치한 인덱스, 인덱스는 0부터 시작하며 str1, str2 둘 다 null terminated string이어야 하고 일치여부 확인시 null 문자는 고려하지 않음. 반환값이 strlen(str1)이라면 일치하는 문자를 못찾은 것. 사용 예시. #include #include int main() { // str1에서 첫번째로 나오는 모음을 찾음 const char str1[] = "Hello world!"; const char str2[].. 2023. 12. 20.
MFC ] 정적 라이브러리에서 MFC 사용 MFC 프로젝트를 생성하면 디폴트가 "공유 DLL에서 MFC 사용"으로 되어있다. 이 설정은 해당 프로그램이 필요로 하는 MFC 라이브러리를 DLL을 사용하여 참조하겠다는 뜻으로 대상시스템에서 Visual C++ 재배포 패키지를 설치하거나, mfc*.dll 파일을 구해 system32 또는 sysWow64 경로에 넣어주어야 정상적으로 동작한다. 반면 "정적 라이브러리에서 MFC 사용" 옵션을 선택하면 실행파일에 필요한 dll이 포함되어 컴파일되기 때문에 실행파일의 사이즈는 커지지만 배포시 별도의 dll을 같이 제공할 필요가 없다. 런타임 라이브러리도 실행파일에 포함시켜 배포하기 위해 /MD가 아니라 /MT 옵션으로 바꿔주는 것도 잊지 않는다. 2023. 12. 15.
MFC ] 컨트롤 색상 변경하기 WM_CTLCOLOR 메시지는 컨트롤이 처음 생성될 때 또는 컨트롤이 다시 그려져야할 필요가 있을 때 컨트롤의 색상을 결정하기 위한 메시지 이다. 이 메시지의 핸들러를 등록하여 컨트롤의 색상을 처리할 수 있다. 파라미터는 다음과 같다. pDC : 윈도우에서 그리기 작업에 필요한 모든 정보를 가지고 있는 디바이스 컨텍스트 구조체 포인터 pWnd : 화면에 그려질 대상 컨트롤에 대한 포인터 nCtlColor : 컨트롤의 종류에 대한 정수값. 예를들어 에디트 컨트롤이라면 CTLCOLOR_EDIT이고 해당 컨트롤이 읽기 전용이라면 CTLCOLOR_STATIC이 된다. 위 파라미터를 활용하여 특정 컨트롤에 대한 색상 처리를 수행하고 변경된 색상을 나타내는 HBRUSH를 반환하면 된다. 반환된 브러시는 실제 해당 .. 2023. 12. 14.
Win32 API ] 윈도우 프로그램의 기본 구조 MFC 프레임워크 안에 숨겨진 윈도우 프로그램의 기본 구조를 이해해보자. Windows에서 실행되는 애플리케이션의 종류 윈도우에서 실행되는 애플리케이션은 크게 콘솔 애플리케이션과 GUI 애플리케이션으로 나눌 수 있다. 콘솔 앱 또는 데스크톱 애플리케이션 만들기 프로젝트 생성 시 콘솔 또는 데스크톱 애플리케이션을 지정하여 생성할 수 있으며, 이미 생성한 프로젝트를 콘솔 또는 GUI 애플리케이션으로 변경하려면 프로젝트 우클릭 - 속성 - 링커 - 시스템 - 하위 시스템에서 변경 가능하다. Windows C/C++ 애플리케이션의 진입점 프로그램이 실행될 때 가장 먼저 호출되는 함수를 프로그램의 진입점(entry point)라고 하고, 이 진입점을 호출하는 함수는 C/C++ 런타임(CRT) 초기화를 담당하는 함.. 2023. 12. 13.
C/C++ ] ANSI 이스케이프 코드 시퀀스 사용해서 커서 이동 + 터미널 조작하기 C/C++ 콘솔 프로그램에서 ANSI 이스케이프 시퀀스 명령어를 사용하여 콘솔 커서 이동 등 터미널을 조작할 수 있다. 1. 이스케이스 시퀀스 시작 : \x1B[ 또는 \033[를 사용하여 ANSI 이스케이프 시퀀스를 시작한다. 아래서는 \x1B[ 기준으로 설명한다. 2. 커서 이동 커서를 위로 이동 : \x1B[A, \x1B[A 또는 \x1B[1A 는 위로 한칸 이동하고 \x1B[2A 는 위로 두칸 이동한다. 커서를 아래로 이동 : \x1B[B 커서를 오른쪽으로 이동 : \x1B[C 커서를 왼쪽으로 이동 : \x1B[D 특정 위치로 커서 이동 : \x1B[;H, row는 행번호 col은 열번호로 \x1B[0;0H 또는 \x1B[1;1H 는 화면의 좌측 상단 첫번째 칸으로 이동한다. 3. 커서 숨기기/보.. 2023. 12. 11.
C/C++ ] 윈도우 콘솔 프로그램 아이콘 변경하기 + 무료 아이콘 찾기 콘솔 프로그램의 기본 아이콘을 변경해보자.      IconFinder 등의 사이트에서 무료 상업용 아이콘 파일을 찾는다. https://www.iconfinder.com/search?q=smile&price=free&license=gte__1 Icons - IconfinderDownload 7,594,057 icons. Available in PNG and SVG formats. Ready to be used in web design, mobile apps and presentations.www.iconfinder.com     Free icon 중에서도 Free for commercial use라고 되어있는 것을 찾는다.     ICO 파일이 아니라 PNG 파일로 다운받는데 128 px 이상으로 받는.. 2023. 12. 9.
C/C++ ] start 명령어 사용 새로운 프롬프트 창에서 시스템 명령 사용하기 start 명령어는 일반적으로 명령 프롬프트나 배치 파일에서 다른 프로그램 또는 명령을 시작하는 데 사용한다. 사용 방법 start [/d ] [/i] [{/min | /max}] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | /belownormal}] [/node ] [/affinity ] [/wait] [/b] [/machine ] [ [... ] | [... ]] https://learn.microsoft.com/ko-kr/windows-server/administration/windows-commands/start start 지정된 프로그램 또는 명령을 실행하기 위해 별도의 명령 프롬프트 창을 시작하는 시.. 2023. 12. 8.
윈도우 소켓 ] select 입출력 모델 select 모델 select() 함수는 동기식 다중 입출력함수(Synchronous Multiplexing IO)로 recv(), send() 등 소켓 함수 호출이 성공할 수 있는 시점을 미리 알 수 있다. 따라서 소켓 함수 호출 시 조건을 만족하지 않아 생기는 여러 문제를 해결할 수 있다. 또한 멀티스레드 방식 등 다른 모델과 비교하여 select 모델의 사용상의 장점은 여러 소켓을 한 스레드로 처리할 수 있다는 점이다.     select 모델 사용 준비 select() 모델을 사용하려면 세 종류의 소켓 셋을 준비해야 한다. 읽기셋, 쓰기셋, 예외셋이 있는데 세 종류중에 필요한 소켓셋만 준비해도 된다. 소켓 셋은 소켓의 집합으로 종류에 따라 소켓들을 담아두는 역할을 한다. 예를 들어 어떤 소켓에 대.. 2023. 11. 26.
C/C++ ] 키보드 메시지 후킹을 사용한 간단 키로거 WH_KEYBOARD_LL 저수준 키보드 후크는 해당 애플리케이션 창이 비활성화되거나 포커스가 없는 상태에서도 모든 키보드 입력 이벤트를 후킹할 필요가 있을 때 사용한다. OS 시스템 메시지 큐에 있는 키 이벤트가 응용프로그램에 도달하기 전에 후킹 되므로 후크 프로시저에서 이벤트를 차단하거나 수정할 수 있다. #include #include #include #include HHOOK hHook; std::ofstream logfile; LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) { LPKBDLLHOOKSTRUCT key = (LPKBDLLHOOKSTRUCT)lParam; if (code >= 0 && wParam == WM.. 2023. 11. 21.
MFC ] PeekMessage() / GetMessage()와의 차이 PeekMessage()와 GetMessage() 함수는 Windows 시스템 메시지 큐에서 메시지를 가져오는 함수이며, 동일한 4개의 매개변수를 갖는다. BOOL PeekMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ); lpMsg: MSG 구조체에 대한 포인터로, 함수 호출 이후 메시지 정보가 채워진다. hWnd: 메시지를 확인할 창 또는 윈도우 핸들. 일반적으로 nullptr로 설정하면 어떤 윈도우에서든 해당 메시지를 확인한다. wMsgFilterMin: 확인할 메시지 범위의 최소 값으로 WinUser.h에 정의되어 있다. wMsgFilterMax: 확인할 메시지 범위의 최대 값으로 Wi.. 2023. 11. 14.
Win32 API ] 메시지 루프 C언어를 처음 배우고 콘솔환경에서 프로그래밍을 하다가 윈도우 프로그래밍을 시작하면 어디가 프로그램의 시작점이고 어디서부터 순차적으로 명령이 실행되는 것인지 알지 못해 당황하는 경우가 적지 않다. 콘솔과 달리 윈도우 환경에서는 사용자가 발생시키는 이벤트에 대한 메시지를 처리하는 방식으로 프로그램이 수행되고 이를 메시지 기반(또는 이벤트 기반) 프로그래밍이라고 한다. 메시지란? 사용자나 시스템에 의해 발생된 일체의 변화에 대한 정보를 말한다. ex. 마우스 왼쪽 버튼 클릭, 키보드 누름, 윈도우 최소화 등 이런 이벤트가 발생하면 윈도우 시스템에 존재하는 메시지큐에 메시지가 쌓이고, 애플리케이션에서는 윈도우시스템 메시지큐에서 메시지를 가져와서 특정 메시지 발생시 어떠한 일을 수행할 것인가에 대한 처리 루틴을 .. 2023. 11. 13.
C#, WinForms ] tabControl의 탭 부분 색상 변경 tabControl의 DrawMode 속성을 OwnerDrawFixed로 설정하고 DrawItem 이벤트 핸들러를 연결 private void Form1_Load(object sender, EventArgs e) { //... tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; tabControl1.DrawItem += new DrawItemEventHandler(tabControl1_DrawItem); //... } 이 부분은 GUI를 통해서도 가능하다. DrawItem 이벤트 핸들러는 각 탭 버튼을 그릴 때 호출된다. e.Index는 현재 탭 버튼의 인덱스로 현재 그려지고 있는 탭 버튼이 어떤 탭 페이지에 해당하는지 확인할 수 있다. e.Bounds는 현재 탭버.. 2023. 11. 7.
MFC ] 특정 컨트롤에 포커스 설정하기 1. 다이얼로그 생성시 특정 컨트롤을 포커스된 상태로 두는법 리소스뷰에서 서식 - 탭 순서를 클릭하면 현재 설정된 탭순서(Tab키 눌렀을 때 이동되는 순서)가 표시되는데 컨트롤을 순서대로 클릭하여 탭순서를 재배치 할 수 있다. 포커스된 상태로 둘 컨트롤을 첫번째 순서로 설정하면 된다. 2. 코드에서 포커스 옮기기 컨트롤 객체가 있다면 바로 .SetFoucs() 함수를 사용하면 되지만 컨트롤 객체가 없는 다이얼로그 상의 컨트롤을 조작하려면 GetDlgItem() 함수를 사용하면 된다. GetDlgItem() 함수는 컨트롤의 ID를 통해 다이얼 로그 상 컨트롤을 식별하는 데 사용되며 컨트롤의 핸들 CWnd*를 반환한다. 이 핸들을 사용해 컨트롤을 조작할 수 있다. CWnd* GetDlgItem(int nID.. 2023. 11. 6.
시스템 종료와 관련된 윈도우 메시지 WM_QUERYENDSESSION, WM_ENDSESSION 다이얼로그 종료시 WM_CLOSE 메시지가 전달되지만, 다이얼로그 종료 전 윈도우가 먼저 종료된다면 WM_CLOSE 메시지는 전달되지 않는다. 따라서 응용프로그램이 윈도우 종료 시 수행해야할 작업이 있다면, WM_QUERYENDSESSION, WM_ENDSESSION 메시지 처리를 통해 가능하다. WM_QUERYENDSESSION 시스템 종료 확인 메시지. 윈도우에선 시스템 종료 또는 로그오프 시 WM_QUERYENDSESSION 메시지를 모든 윈도우에 전송하고, 응용프로그램은 이 메시지를 받아서 준비작업을 수행한 뒤 TRUE를 반환하거나 종료를 취소하기 위해 FALSE를 반환할 수 있다. 만약 모든 응용프로그램이 TRUE를 반환하면 WM_ENDSESSION 전송 단계로 넘어간다. WM_ENDSESSIO.. 2023. 11. 2.
Win32 API ] 이벤트 / CreateEvent, SetEvent, ResetEvent Windows 프로그래밍에서 이벤트를 생성하고 다루는 함수인 CreateEvent, SetEvent, ResetEvent 와 이벤트 대기 함수인 WaitForSingleObject 를 사용해서 스레드 간 통신 또는 동기화를 수행할 수 있다. CreateEvent() CreateEvent 함수는 이벤트 객체를 생성한다. 이벤트 객체는 signaled, non-signaled 상태가 있는데 SetEvent 함수를 통해 이벤트 신호를 보내거나 WaitForSingleObject 함수를 통해 이벤트 신호를 받을 수 있다. HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR.. 2023. 10. 31.
윈도우 소켓 ] 소켓과 연결된 원격 호스트의 IP주소와 Port번호 가져오기, getpeername() getpeername() int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); sockfd: 정보를 얻고자 하는 소켓의 파일 디스크립터 addr: 원격 호스트 주소 정보를 저장할 sockaddr 구조체 포인터. 주로 struct sockaddr_in 변수를 만들고 (struct sockaddr*)로 캐스팅하여 사용함 addrlen: 구조체의 크기를 나타내는 변수 주소, sizeof 연산자 사용 사용 예시. struct sockaddr_in serverAddr; socklen_t addrLen = sizeof(serverAddr); // 연결된 원격 호스트 정보 얻기 if (getpeername(sockfd, (struct sock.. 2023. 10. 28.
Win32 API ] waitForSingleObject, waitForMultipleObjects waitForSingleObject() 이 함수는 다양한 유형의 핸들에 대한 대기 및 감시를 지원한다. 핸들이 신호를 보낼 때까지 또는 타임아웃이 발생할 때까지 블록되며, 해당 이벤트가 발생하면 반환된다. DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); hHandle: 대기하려는 핸들(이벤트, 뮤텍스, 세마포어 등) dwMilliseconds: 밀리초 단위 대기 제한 시간, 0을 사용하면 바로 반환하고 INFINITE를 사용하면 무한 대기한다. DWORD 리턴값 WAIT_OBJECT_0(0): 대기가 성공적으로 종료된 경우. 대상 핸들이 스레드인 경우엔 스레드가 종료된경우, 대상 핸들이 뮤텍스인 경우엔 뮤텍스 락을 획득한 경우, 대상.. 2023. 10. 14.
고해상도 타이머 QueryPerformanceFrequency, QueryPerformanceCounter 윈도우 운영체제에서 시스템의 경과 시간을 측정하는 데 사용되는 함수로 GetTickCount()와 GetTickCount64()가 있다. 이 함수는 시스템 부팅 이후 경과한 밀리초(ms)단위의 시간을 반환하며 주로 시간 간격을 측정하는 데 사용된다. GetTickCount() 함수는 32비트 부호없는 정수 타입으로 시간을 반환하며, 시스템이 부팅된 이후 49.7일이 지나면 오버플로우가 발생되므로 64비트 부호없는 정수로 시간을 반환하는 GetTickCount64()를 대신 사용하는 것이 권장된다. 다만 이 함수의 해상도는 일반적으로 10밀리초에서 16밀리초 범위의 시스템 타이머의 해상도로 제한되기 때문에, 조금더 고해상도 타이머가 필요하다면 QueryPerformanceFrequency(), QueryP.. 2023. 10. 9.
C++ ] mutex, lock_guard mutex mutex(뮤텍스)란 다중 스레드 환경에서 공유 데이터에 대한 동시 접근을 제어하기 위해 사용하는 동기화 기법 중 하나이다. mutual exclusion의 약자로 여러 스레드가 동시에 접근하지 못하도록 lock 하는 기능을 제공한다. mutex 사용 예시 #include #include #include using namespace std; mutex myMutex; int sharedVariable = 0; void incrementSharedVariableWithMutex(int iterations) { for (int i = 0; i < iterations; ++i) { myMutex.lock(); // 뮤텍스를 잠근다. // 공유 데이터에 대한 안전한 업데이트를 수행한다. ++share.. 2023. 10. 8.
C++ ] 인라인 함수 인라인 함수란? 보통 일반함수를 사용할 때는 함수의 선언은 헤더파일에 하고 정의는 소스파일에 분리한다. 하지만 함수를 헤더파일에 정의하고 inline 키워드를 사용하면 인라인 함수로 만들 수 있다. inline 키워드를 사용하면 컴파일러는 해당 함수를 호출하는 곳에 직접 인라인 함수 코드를 삽입한다. 이렇게 하면 보통 일반함수를 헤더에 정의했을 때 발생하는 오류인 함수 정의가 여러번 중복된다는 오류를 피할 수 있다. 인라인 함수 사용이 효과적인 경우 보통 인라인 함수는 함수 코드 크기가 작고 간단할 때 가장 효과적이다. 인라인 함수가 너무 크거나 빈번하게 호출되는 경우 해당 인라인 함수 코드가 함수 호출 부분에 삽입되기 때문에 코드 크기가 커져 메모리 사용량이 증가하고 캐시 효율성을 낮출 수 있다. 인라.. 2023. 10. 7.
C++ ] 연속된 메모리 공간에 저장되는 벡터의 메모리 재할당 빈도 C++의 std::vector는 동적 배열로 구현되어 있어, 내부적으로 메모리를 할당하고 관리하는데 요소를 연속된 메모리 공간에 저장하는 것을 보장한다. 때문에 데이터에 접근할 때 빠른 속도를 제공하고, C스타일 배열 접근 방식을 써서 효율적으로 사용할 수도 있다. vector에 요소를 계속 추가하면 vector는 내부적으로 메모리를 다시 할당하고 복사해 옮기는 작업을 수행하는데 이를 재할당이라고 한다. 재할당은 vector의 현재 capacity(용량)와 size(크기)를 비교하여 추가 요소를 수용하기 부족하다고 판단되는 경우 발생할 수 있다. 메모리 재할당은 비용이 높은 작업이고 벡터가 자주 재할당되면 성능이 저하될 수 있기 때문에 이를 최소화하기 위해 reserve()를 사용하여 용량을 예약하는 방.. 2023. 10. 6.
C++ ] enum class 사용법 enum class 선언 enum class를 정의할 때 명시적으로 기본 타입을 지정하지 않으면 int 형으로 설정된다. 또한 첫번째 멤버의 값을 지정하지 않은 경우 첫번째 멤버는 0으로 초기화되고 그 다음 멤버는 1씩 증가한다. enum class MyEnum { VALUE1, VALUE2, VALUE3 }; 열거형 멤버 접근 :: 연산자를 사용해 접근한다. MyEnum myVar = MyEnum::VALUE1; 정수값으로 변환 enum 클래스의 기본 타입이 int라고 해도 바로 정수값으로 변환되지는 않기 때문에 형변환 연산자를 사용해야 한다. int intValue = 0; MyEnum enumValue = MyEnum::VALUE1; if (intValue == enumValue) { // 오류! .. 2023. 10. 3.
윈도우 소켓 ] 논블로킹 소켓, ioctlsocket, 소켓 함수의 리턴 조건과 WSAEWOULDBLOCK이 리턴되는 상황 socket() 함수로 생성된 소켓은 기본적으로 블로킹 소켓이다. 그리고 블로킹 소켓은 소켓함수 호출 시 조건을 만족할 때까지 리턴하지 않는다. 주요 소켓 함수별 리턴 조건은 다음과 같다. accpet() : 접속한 클라이언트가 있을때 connect() : 서버에 접속 성공했을 때 send() : 응용 프로그램이 전송 요청한 데이터를 소켓 송신 버퍼에 모두 복사했을 때 recv() : 소켓 수신 버퍼에 도착한 데이터를 응용 프로그램이 제공한 버퍼에 복사했을 때 반면 논블로킹 소켓은 소켓함수 호출 시 조건을 만족하지 않아도 함수가 리턴하고 다음 코드가 수행된다. socket()으로 생성된 소켓을 논블로킹 소켓으로 소켓 모드를 변경하는 방법은 다음과 같다. u_long on = 1; if (ioctlsock.. 2023. 10. 2.
윈도우 소켓 ] 소켓 옵션, setsockopt, getsockopt, SOL_SOCKET 옵션들 setsockopt setsockopt 함수는 소켓 옵션을 설정하는 데 사용된다. int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); sockfd : 옵션을 설정할 대상이 되는 소켓을 식별하는 데 사용되는 소켓 디스크립터로, 소켓을 생성하고 열 때 반환되는 정수값이다. level: 설정하려는 옵션이 어느 레벨에 속하는지 지정한다. 주로 SOL_SOCKET 레벨을 사용하고, 특정 프로토콜 레벨 옵션인 경우, IPPROTO_IP, IPPROTO_IPV6, IPPROTO_TCP 등을 사용할 수 있다. optname: 설정하려는 옵션의 이름을 지정한다. 예를 들어, SO_BROADCAST, SO_KEEP.. 2023. 10. 1.
윈도우 소켓 ] connect 비동기로 처리하기 논블로킹 소켓으로 설정한 뒤 connect를 시도한다. connect 함수의 리턴값이 SOCKET_ERROR인 경우, WSAGetLastError()로 오류를 확인하여 WSAEWOULDBLOCK 인 경우 현재 백그라운드에서 연결이 진행중임을 나타낸다. writeSet에 소켓을 넣고 select 함수를 호출하여 타임아웃 시간 동안 write-ready 상태가 되는지 감지한다. select() 함수는 오류가 발생한 경우 -1, 타임아웃인 경우 0 그리고 이벤트를 감지한 경우 감지한 소켓 수를 리턴한다. // 논블로킹 모드로 설정 u_long nonBlockOpt = 1; if (ioctlsocket(cSocket, FIONBIO, &nonBlockOpt) == SOCKET_ERROR) { OutputDebu.. 2023. 9. 30.