목록Programming/C (16)
외로운 Nova의 작업실
안녕하세요. 저번시간에 이어서 오늘은 이름을 입력받고 그이름과 함께 메시지를 전달하는 기능을 추가해보도록 하겠습니다. 아래는 기능의 원리입니다. 1. 이름을 순차적으로 저장할 2차원 배열을 생성 2. 클라이언트가 첫번째로 메시지를 보내오면 이름이기때문에 클라이언트 번호에 맞게 배열에 저장 3. 클라이언트가 종료하면 소켓 배열에서 없애는것처럼 이름 배열도 시프트연산으로 없애줌 4. 반복 c언어에서 문자열을 다루기는 좀 까다롭습니다. 그래서 문자열에 관한 함수들을 좀 정리해 볼까합니다. #include //문자열 합치는 함수 erron_t strcat_s ( char * s1 ,size_t size, const char *s2 ); //s2를 s1뒤에 size만큼 저장 //문자열을 복사하는 함수 erron_..
안녕하세요. 저번 시간에 멀티 채팅 콘솔앱을 만들어보았습니다. 하지만 서버쪽에서 소켓의 정상적인 종료가 아니였음을 코딩하던중에 알게되었습니다. 이번시간에는 정상적인 종료가 무엇인지 저의 생각을 얘기하고 해결을 해보도록 하겠습니다. 비정상적인 종료는 클라이언트 쪽에서 문제가 있었습니다. 바로 recv()함수가 블로킹 상태였는데 closesocket()이 호출된것입니다. 클라이언트쪽에서 쓰레드가 2개였습니다. 하나는 send쓰레드 하나는 recv쓰레드이였습니다. 종료를 위해 q를 입력하면 send 쓰레드쪽에서 closesocket()을 호출하고 exit(1)을 했습니다. 하지만 위의 과정들이 진행되고있음에도 recv쓰레드에서 recv()함수는 계속 블로킹 상태였습니다. 결국 recv()함수가 블로킹상태임에도..
안녕하세요. 저번시간까지 소켓프로그래밍을 배웠습니다. 배운 소켓프로그래밍으로 이제 멀티 채팅 콘솔앱을 만들어보겠습니다. 보낸 소켓에 이름을 부여하고 그 소켓이 메시지를 보내오면 서버쪽에서 이름과 함께 메시지를 연결된 클라이언트에게 같이 보내는 서버를 구현하도록 하겠습니다. 이후에는 c#의 winform을 활용해서 ui까지 가지고있는 winform앱도 만들어보겠습니다. 먼저 이름을 부여하지않은 멀티 채팅의 원리는 이러합니다. 1. 서버가 클라이언트를 받는다. 2. 부모 서버는 받은 클라이언트를 클라이언트만 모아놓은 소켓 배열에 추가한다. 3. 이후 받은 클라이언트를 처리하는 쓰레드를 만들고 클라이언트를 쓰레드에 맡겨놓는다. 4-1. 쓰레드는 클라이언트로부터 recv하고 만약 0이 전달되면 클라이언트만 모아..
안녕하세요. 오늘은 지난시간에이어 다중 접속 서버 구현 3번째 방법 멀티쓰레드에대해서 배워보겠습니다. 먼저 "쓰레드"란 무엇일까요? 한번 쓰레드를 프로세서에 비교해 설명해볼까합니다. 우리는 저번 11장에서 멀티 프로세서를 배웠습니다. 프로세서는 ram에 공간을 차지하며 실행중인 프로그램이라고 설명드렸습니다. 또한 구조는 스택,데이터영역,힙으로 이루어져있습니다. 멀티프로세서는 부모프로세서에서 스택,데이터영역,힙 3개를 다 복사해서 따로 ram에 공간을 또 만들어서 자식프로세서를 만드는 구조였습니다. 하지만 쓰레드는 부모프로세서에서 지정 스택만 복사해서 따로 가져가고 데이터영역과 힙은 부모프로세서랑 공유합니다. 이는 멀티프로세서가 굉장히 무거운일이기때문에 고안되었습니다. ram의 자원은 한정적이였기때문에 최..
안녕하세요. 저번장에서는 멀티프로세서 기반 다중서버의 원리에대해서 배워보았습니다. 이번 장에서는 다중 서버 구현의 2번째 방법 멀티 플렉싱에대해서 배워보겠습니다. 멀티 플렉싱방법은 멀티프로세서와 다르게 윈도우에서도 구현이 되어있습니다. 따라서 구현되어있는 c언어 수준의 함수들과 사용방법들도 배워보고 구현도 한번 해보겠습니다. 먼저 멀티플렉싱이라는 단어가 생소하실 것 이라고 생각합니다. 저번 장에서 배운 멀티 프로세서는 부모 프로세서가 자식 프로세서를 만들어서 자식 프로세서에게 알아서 처리하라고 하는 방법이지만, 멀티 플렉싱방법은 부모프로세서가 다 처리하는 방법입니다. 즉, 사람으로 친다면 손이 2개여서 할 수 있는 일이 한정적이지만 멀티플렉싱을 적용시키면 손을 여러개 만들어주는 것입니다. 간단하게 한 프..
안녕하세요. 오늘부터는 다중 접속 서버에 대해서 배워보겠습니다. 다중 접속서버란 이전에 해왔던 echo서버는 하나의 소켓(손님이 한명)에대해서만 요청을 받고 응답하는 프로그램을 짯습니다. 하지만 이번에는 여러개의 소켓(손님이 여러명)에대해서 요청을 받고 응답하는 프로그램을 짜보겠습니다. 여러개의 소켓을 다루는 방법에는 총 3가지 방법이있습니다. 각각마다 호출하는 함수와 내부적으로 동작하는 방식이 다릅니다. 아래는 그 3가지 종류입니다. 1. 멀티프로세서서 기반 서버 2. 멀티플렉싱 기반 서버 3. 멀티쓰레드 기반 서버 첫번째로, 멀티 프로세서에대해서 배워볼까했습니다. 하지만 멀티 프로세서의 기능은 리눅스 운영체제에서 가능한 기능입니다. 정확히말하면 윈도우에서 c언어 수준으로 구현된 함수나 헤더파일이 없다..
안녕하세요. 오늘은 소켓의 다양한 옵션들을 출력하고 설정해보는 것을 공부해볼까합니다. 소켓의 옵션에는 너무 많은 옵션들이있어서 자주 사용되는 옵션들만 보려고합니다. 먼저 아래는 옵션들을 얻어(get)오고 설정(set)하는 함수의 정의입니다. int getsockopt(SOCKET sock, int level, int opname, char* optval, int* optlen); //sock에 opname설정의 값을 optval주소값에 optlen만큼 넣는다 int setsockopt(SOCKET sock, int level, int opname, char* optval, int optlen); //sock에 opname의 설정값을 optval주소에 있는 optlen크기의 값으로 변경한다. 위의 정의에서..
안녕하세요. 오늘은 어제에 이어서 ip주소로 도메인이름을 출력해보도록 하겠습니다. 아래는 ip주소로 도메인이름 정보를 얻어오는 관련 함수입니다. //아래는 ip주소로 도메인 네임을 얻어오는 함수 int getnameinfo(SOCKADDR* pAddr, socklen_t addrLen, char* nodeBuffer, WORD nodeSize, char* serviceBuffer, WORD serviceSize, int flage) //pAddr 주소에 있는 정규화된 도메인이름을 nodeBuffer에 넣고 서비스이름을 serviceBuffer에 넣음 //ms에서는 nodeSize에는 NI_MAXHOST, serviceBuffer에는 NI_MAXSERV를 넣음 하지만 요즘에는 dns서버에게 ip를 주고 도..
안녕하세요. 오늘은 어제 오류에대해서 공부하고 원래 하려했던 도메인네임으로 ip를 받아보도록 하겠습니다. 먼저 어제 오류는 WSA관련 함수를 사용하지않아서 나타나는 현상이였습니다. 그러니 socket프로그래밍을 winsock.h를 통해서 할땐 꼭 wsa관련함수를 작성해야 합니다. 하지만 어제 짯던 프로그램은 돌아가지 않았습니다. 먼저 코드를 보시죠 #include #include #include #include #include int main(int argc, char* argv[]) { WSADATA wsaData; struct addrinfo hint; //힌트를 담을 구조체 선언 struct addrinfo* result; //결과값을 담을 구조체 포인터 선언 int check = 0; //geta..
안녕하세요, 오늘은 지난 시간에 이어 DNS와 관련된 함수를 배워보도록하겠습니다. 먼저 DNS란 Domain Name System의 약자로 IP를 문자(Name)으로 알 수 있게 해주는 시스템입니다. 컴퓨터의 세계에서 통신은 잘 알다시피 IP로 진행을 합니다. 다만 이 IP는 사람이 잘 기억하지못합니다. 예를들어 구글 서버의 IP는 142.250.199.68입니다. 만약 DNS가 없었다면 우리는 구글링을 할때 항상 142.250.199.48을 쳐서 구글서버에 요청을 보낼것입니다. 그렇다면 질문하겠습니다. google을 외우기 편할까요? 아니면 142.250.199.48이 외우기 편할까요? 사람이라면 문자를 배웠다면 당연히 google이 편합니다. 이처럼 사람들이 편리하게 서버를 찾고 통신하기 위해 DNS..