목록전체 글 (420)
외로운 Nova의 작업실
안녕하세요. 원래는 하드웨어 공부를 하려했는데, 하드웨어 관련 공구들이나 재료들을 살 돈이 아직 없어서 먼저 c#언어를 공부하려고합니다. c#은 윈도우 form을 만들 수 있어서 ui에 친숙한 언어입니다. 다만 윈도우에서만 실행가능한 어플리케이션을 만들 수 있습니다. 하지만 데스크탑의 os가 거의 윈도우라는 점을 인식하면 굉장히 winform은 유용합니다!(만들면 많은 사람들이 쓸 수 있기때문입니다) c#은 객체지향 프로그래밍입니다. c언어는 절차지향 프로그래밍으로 코드를 짤때 순서대로 짜야한다는 생각을 가지고 하지만, c#은 객체지향 프로그래밍이므로 클래스(자판기에서의 버튼같은 일정 일을 하는 모듈)를 만들고 사용한다는 생각을 가지고 프로그래밍합니다. 먼저, hello world 콘솔 출력 c#언어를 ..
안녕하세요. 저번시간에 이어서 오늘은 이름을 입력받고 그이름과 함께 메시지를 전달하는 기능을 추가해보도록 하겠습니다. 아래는 기능의 원리입니다. 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()함수가 블로킹상태임에도..