본문 바로가기

Programming Language/C&C++

SAFEARRAY의 간단한 사용법 정리 SafeArray 객체 생성 및 파괴 SafeArray를 생성하고 파괴하는 과정을 알아보기 위해 다음 코드를 작성해 본다. 배열을 구성하는 각 원소의 자료형이 부호 없는 8비트 정수(바이트 형)이고 10개로 구성된 배열의 생성법은 다음과 같다. /* Example: SafeArrayCreate, SafeArrayDestroy */ #include #include #include #include int main(int argc, char * argv[]) { HLOCAL hLocal = NULL; LPSAFEARRAYBOUND lpSafeArrayBound = NULL; LPSAFEARRAY lpSafeArray = NULL; hLocal = LocalAlloc(LHND, sizeof(SAFEARRAYBO.. 더보기
[소켓 프로그래밍]UDP 브로드캐스트에 의한 데이터 보내기 및 받기 보내기 측 코드 다운로드 시 참고: Dev-C++로 작성되었음. /* Example: main.c */ #include #include #include #include #include #include #include #define PORT 65429 int main(int argc, char *argv[]) { int temp; char message[] = "Hello, World!"; WSADATA wsaData; SOCKET sock; int fBroadcast = 1; struct sockaddr_in sockaddr1; struct sockaddr_in sockaddr2; WSAStartup(MAKEWORD(2, 2), &wsaData); /* 소켓을 생성한다. socket([IPv4 인터넷 사.. 더보기
소켓 통신 #3 - ICMP 클라이언트 구현하기(3) 소켓 통신 #3 - ICMP 클라이언트 구현하기(3) - by Tapito 2편에서 ICMP 패킷을 sendto로 보낼 때는 IP 헤더를 소켓에서 알아서 작성하도록 지정했습니다. 이번에는 IP 헤더를 직접 구성하여 패킷을 보내보도록 하겠습니다. IP 헤더를 직접 작성하기 위해서는 setsockopt 함수에서 IP_HDRINCL 속성을 지정해야 합니다. /* 예제 */ #pragma comment(lib, "ws2_32.lib") #include #include #include #include #include #include #pragma pack(push, 1) typedef struct _tagIPHDR4 { BYTE bVersionIHL; // Version and IHL BYTE bTypeOfSer.. 더보기
윈도우에서 IP 주소 얻는 방법 윈도우에서 IP 주소 얻는 방법 - by Tapito 인터넷으로 패킷을 주고 받기 위해서는 상대방과 자기 자신의 IP 주소를 알아야 합니다. 이 IP 주소는 세계 어디서나 식별 가능한 공인 IP일 수도 있고 같은 라우터에 물려있어야 식별 가능한 사설 IP일 수도 있습니다. 상대방의 IP 주소는 비교적 쉽게 얻을 수 있거나 이미 알고 있는 상태이기 때문에 문제가 되지 않지만 자기 자신의 IP를 얻는 방법은 약간 복잡합니다. 흔히 10.xxx.xxx.xxx, 172.16.xxx.xxx ~ 172.31.xxx.xxx, 192.168.xxx.xxx로 시작하는 주소는 사설 IP로서 같은 공유기에 물려있는 장치들 사이에서나 유효하며 이 범위가 아닌 IP가 아니더라도 같은 네트워크에 접속된 장치들에서만 유효한 사설 .. 더보기
소켓 통신 #3 - ICMP 클라이언트 구현하기(2) 소켓 통신 #3 - ICMP 클라이언트 구현하기(2) - by Tapito ICMP로 통신하기 위해서는 저수준 소켓을 만듭니다. 만일 Windows 운영체제에서 이 단계에 INVALID_SOCKET이 반환되고 GetLastError 함수 등을 통해 10013 오류가 확인되었다면 해당 프로그램을 관리자모드로 실행하면 됩니다. SOCKET icmpSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); struct sockaddr_in icmpDestination에 ping을 보낼 대상이 미리 저장되어있다고 하면 sendto 소켓함수를 통해 상대방의 수신 여부와 무관하게 일방적으로 데이터(ICMP를 포함한 패킷 전체)를 쏩니다. 전송 성공 시 전송된 바이트 수를 반환하고 그렇.. 더보기
소켓 통신 #3 - ICMP 클라이언트 구현하기(1) 소켓 통신 #3 - ICMP 클라이언트 구현하기(1) - by Tapito ICMP 패킷 헤더 이번에는 좀 더 저수준으로 소켓을 다뤄보겠습니다. ICMP(Internet Control Message Protocol)는 ping 명령에서 사용되는 프로토콜로 목적지와의 통신이 원활한지를 확인하는데 사용됩니다. 저수준이니만큼 패킷의 구조도 직접 작성해야 하는데요, 목적지로 ping을 보내서 되돌아오기까지의 과정에서 주고받는 데이터를 에코(echo)라 합니다. 에코를 보내고 받을 때 전달되는 ICMP 구조체는 아래와 같이 선언하기로 약속(RFC 792 규격)되었습니다. /* ICMP 헤더 구조체의 예 */ typedef struct _tagICMPHDR { BYTE bType; // Type BYTE bCode.. 더보기
소켓 함수를 사용하여 도메인을 IP주소간 상호 변환하기 getnameinfo는 IP 주소에서 도메인으로 변환하는 기능을, getaddrinfo는 도메인에서 IP 주소로 변환하는 기능을 제공합니다.최근의 DNS 서버는 IP 주소에서 도메인으로 변환하는 Reverse DNS 기능을 지원하지 않기 때문에 getnameinfo 함수의 결과가 올바르지 않을 수 있습니다. /* 예제 */ /* WinSock 라이브러리를 링크합니다. */ #pragma comment(lib, "ws2_32.lib") /* 소켓 구조체를 사용하기 위한 헤더 */ #include /* getnameinfo와 getaddrinfo가 선언된 헤더 */ #include #include #include #include int main(int argc, char * argv[]) { ADDRINFO.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (4) 소켓 통신 #2 - AF_INET 사용하기 (4) - by Tapito 이전 포스팅까지 해서 서버와 클라이언트간의 연결 작업은 모두 마쳤습니다. 이제 본격적으로 데이터를 교환해보겠습니다. 데이터의 교환은 전송을 담당하는 send와 수신을 담당하는 recv 함수로 수행됩니다. int send(SOCKET s, const char * buf, int len, int flags); int recv(SOCKET s, char * buf, int len, int flags); s: 데이터를 주고 받을 대상을 나타내는 소켓입니다. buf: 주고 받을 데이터가 기록되어있거나 기록될 버퍼입니다. len: 버퍼의 크기(바이트)입니다. flags: 송수신 관련 옵션입니다. 현재로서는 0으로 해도 무방합니다. 반환 값은 상.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (3) 소켓 통신 #2 - AF_INET 사용하기 (3) - by Tapito 소켓을 사용하기 위해 서버와 클라이언트 모두 각 단계별로 실행할 함수에 대해 알아보았습니다. 이를 종합하여 완성된 소스는 다음과 같습니다. Linux/Unix 에서는 잘 작동 될 것이라 생각되지만, Windows 사용자는 잘 작동이 안될 수 있습니다. WinSock이라는 약간 다른 함수를 사용하기 때문입니다. /* server.c */ int main(int argc, char * argv[]) { /* 자기 자신의 포트와 IP 주소 */ struct sockaddr_in sockaddrServer; /* sockaddrServer 구조체 인스턴스의 크기 */ int sockaddrServerLength = sizeof(sockadd.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (2) 소켓 통신 #2 - AF_INET 사용하기 (2) - by Tapito 이번에는 서버가 되어 접속 요청을 받아들여보겠습니다. 클라이언트에서는 접속 대상의 sockaddr_in 구조체 세팅 - socket() 함수 - connect() 함수의 3단계로 접속이 진행된 반면, 서버는 자신의 sockaddr_in 구조체 세팅 - socket() 함수 - bind() 함수 - listen() 함수 - accept() 함수의 5단계로 접속이 진행됩니다. 1단계. sockaddr_in 구조체 설정하기 sockaddr_in 구조체 설정은 클라이언트와 크게 다르지 않습니다. 다만 자신의 IP 주소를 명시하지 않는다는 차이가 있습니다. /* 사용 예 */ struct sockaddr_in sockaddr_internet;.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (1) 소켓 통신 #2 - AF_INET 사용하기 (1) - by Tapito sockaddr_in 구조체를 사용해 인터넷망에 연결해보겠습니다. 여기에서는 편의상 localhost(127.0.0.1):1435번 포트에 접속해 패킷을 교환합니다. 1단계. sockaddr_in 구조체 설정하기 접속할 네트워크, 접속 대상과 포트 번호를 설정합니다. /* sock_ex01.c */ struct sockaddr_in sockaddr_internet; /* 주소 체계로서 IPv4를 사용하는 인터넷망에 접속 */ sockaddr_internet.sin_family = AF_INET; /* 접속할 대상은 127.0.0.1 */ serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); /.. 더보기
소켓 통신 #1 - 소켓 통신에 쓰이는 구조체 소켓 통신 #1 - 소켓 통신에 쓰이는 구조체 - by tapito sockaddr 구조체 소켓을 통해 여러 형태의 네트워크를 거의 비슷한 방식으로 데이터를 교환할 수 있습니다. sockaddr는 일종의 추상 클래스처럼 소켓으로 통신하기 위한 여러 네트워크의 상위 구조체입니다. sockaddr 아래 인터넷망을 사용해 통신하는 구조체인 sockaddr_in과 유닉스 운영체에서 프로세스간 통신을 위해 사용되는 sockaddr_un의 구조체가 선언되어 있습니다. /* sockaddr 구조체 */ struct sockaddr { sa_family_t sa_family; char sa_data[14]; }; sa_family: 소켓이 사용되는 네트워크의 종류입니다. 다음 값 중 하나가 올 수 있습니다. AF_IN.. 더보기
C++11에서 추가된 클래스 - thread 최신 버전의 C++11 라이브러리에서는 운영체제의 함수를 사용하지 않고도 자체적으로 멀티스레드를 구현할 수 있습니다. std::thread 클래스가 바로 그 기능을 수행합니다. 함수를 서로 다른 스레드에서 실행시키는 방법은 다음과 같습니다. 1. 스레드 객체를 생성한다. std::thread의 생성자는 매개변수가 없는 함수의 경우: thread(함수) 매개변수가 있는 함수의 경우: thread(함수, 매개변수 순서대로 나열...) 이렇게 스레드 객체를 생성하는 것만으로도 이미 함수가 실행됩니다. 별도의 start/stop 함수를 호출하지 않습니다. 왜인지는 모르겠으나 C#처럼 해당 스레드를 일시중지시켰다 재개하는 기능은 원래 없습니다. C++의 thread클래스는 해당 함수가 스스로 종료할 때 까지 스레.. 더보기
C언어 표준 문자열 관련 함수 – ANSI, Wide Char별 함수 이름 정리 C 언어 표준 문자열 관련 함수 ANSI, Wide Char 별 함수 이름 정리 - by Tapitolife C언어에는 문자열 처리 방식이 크게 4가지가 있습니다. SBCS: 1글자의 크기가 1바이트인 문자세트입니다. 흔히 쓰는 ASCII 코드라고 보면 됩니다. 이 경우 한글을 포함한 로마자 외 다른 글자는 지원되지 않습니다. (도스를 생각하시면 되겠네요.) DBCS: 1글자의 크기가 2바이트인 문자세트입니다. 유니코드를 이야기하지는 않습니다. SBCS로 나타내기에는 너무 많은 글자들을 표현하는 방식으로 KS-X-1001과 같은 코드가 대표적입니다. MBCS: 문자의 종류에 따라 1글자의 크기가 다른 문자세트입니다. SBCS + DBCS의 짬뽕인데요. 아마 컴퓨터 처음 배우셨을 때 들으셨을 내용. 한글은.. 더보기
코드 컨벤션 정리 – 낙타, 파스칼, 헝가리안 코드 컨벤션 정리. 낙타 케이싱, 파스칼 케이싱, 헝가리안 표기법 - by Tapitolife 좋은 프로그래밍 습관을 만들기 위해 총 2편으로 좋은 코드 컨벤션을 정리 해 보았습니다. 그냥 거두절미하고 여기 첫 번째 포스팅에서는 변수 표기법에 대해 정리해 보았습니다. ▶ 변수명 표기법 상용 프로그램 하나 만들기 위해서 보통 여러 명의 개발자가 수 백만 라인의 코드를 작성합니다. 이 때 개발자들은 필요에 따라 변수, 상수, 함수 등을 선언합니다. 그런데 이때 문제가 생깁니다. ▶ 첫 번째 문제 상황 – 데이터 형의 혼란 개발자 여럿이 모여 수백만 라인의 코드를 작성하다 보면 자연스럽게 수 많은 변수/함수들이 선언됩니다. 이 때 그것들을 사용함에 있어 혼돈의 소지가 있습니다. "지금 이게 전역 변수였나?",.. 더보기