프로그래밍/C72 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. 윈도우 소켓 ] 논블로킹 소켓, 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. C] strstr, strcmp, strncmp, stricmp, strnicmp 함수 구현 strstr()strstr() 함수는 문자열 내에서 부분 문자열(substring)을 검색하는 함수로 str1에서 str2를 찾아서, 첫 번째로 등장하는 위치의 포인터를 반환한다. str2의 길이가 0이면 str1 포인터 반환str2가 str1에서 발견되지 않으면 NULL 반환찾은 경우 str1에서 str2가 시작되는 위치의 포인터 반환 const char* my_strstr(const char* str1, const char* str2) { // 빈 문자열 검색 시 원본 문자열 반환 if (*str2 == '\0') { return str1; } // 메인 검색 루프 for (; *str1 != '\0'; str1++) { if (*str1 == *s.. 2023. 9. 15. C ] Data Types Range C type stdint.h type Bits Sign Range char uint8_t 8 Unsigned 0 .. 255 signed char int8_t 8 Signed -128 .. 127 unsigned short uint16_t 16 Unsigned 0 .. 65,535 short int16_t 16 Signed -32,768 .. 32,767 unsigned int uint32_t 32 Unsigned 0 .. 4,294,967,295 int int32_t 32 Signed -2,147,483,648 .. 2,147,483,647 unsigned long long uint64_t 64 Unsigned 0 .. 18,446,744,073,709,551,615 long long int64_t 6.. 2023. 9. 15. extern "C" {} extern "C" {} 는 .cpp 소스파일에서 C 스타일로 작성된 함수나 변수를 사용하기 위한 C++의 키워드로, extern "C" {} 문구를 사용하면 해당 블록 내에 있는 함수나 변수를 C 스타일로 링크하도록 지시할 수 있다. C++ 컴파일러는 C++ 언어의 특징을 따르는데, C++은 함수 오버로딩, 이름 맹글링(name mangling) 등의 기능을 지원하기 때문에 C 와는 다른 링킹 규칙을 가지고 있다. 따라서 extern "C" 키워드를 사용하면 C++ 코드에서 해당 블록 내에 선언된 C 함수나 C 변수를 호출 또는 참조할 때 C 스타일의 링킹 규칙을 따르도록 한다. extern "C" { // C 함수 extern void myCFunction(int arg); } extern "C" {.. 2023. 7. 18. C, C++ ] system("pause") 대신 사용할 수 있는 방법 system("pause")는 운영체제에 종속적이고 운영체제에게 "pause"라는 명령을 실행하도록 요청하므로 비슷한 기능을 구현할 다른 방법을 생각해보자. C 윈도우 환경에서만 가능한 방법 #include #include int main() { printf("Press any key to continue...\n"); while (!_kbhit()); (void)_getch(); return 0; } conio.h 는 윈도우에서만 사용 가능하다. C #include int main() { printf("Press Enter to continue...\n"); (void) getchar(); return 0; } getchar()는 표준 라이브러리이기 때문에 이식성이 좋으며, 보다 간단하게 사용자의 입력.. 2023. 7. 11. C ] 포인터와 const const는 변수나 함수 매개변수를 선언할 때 사용되는 한정자로 값을 변경할 수 없음을 나타낸다. 변수를 상수로 취급하고자 할 때 유용하며, 많은 곳에서 참조되고 변경되는 것을 원하지 않는 정적인 정보를 보호하는데 사용된다. 포인터 형식과 const 한정자가 같이 쓰일 때 const의 위치에 따라 다음과 같은 차이가 있다. 1. 상수를 가리키는 포인터 : ptr의 역참조를 통해 값을 변경할 수 없지만, ptr이 다른 주소를 가리키도록 변경할 수 있다.const int* ptr 2. 상수 포인터 : ptr 자체를 다른 주소를 가리키도록 변경할 수 없지만, ptr의 역참조를 통해 값을 변경할 수 있다.int* const ptr 3. 상수를 가리키는 상수 포인터 : ptr이 가진 주소를 변.. 2023. 5. 30. 이전 1 2 3 4 5 6 ··· 8 다음