Day4
소켓을 사용한 TCP/IP 서버, 클라이언트 프로그램을 멀티 쓰레딩 버젼으로 수정해 보았다. 또한 서버에 있는 파일의 내용도 클라이언트에게 전송해보고, 파일을 읽고 쓰는 것과 어떤 차이점이 있는지 생각해 보았다. 마지막으로 우리가 만들 프로그램을 위한 커맨드라인 인터페이스를 짜 보았다. 사용해야하는 함수가 생길때마다 manual 페이지를 읽어보면서 신경써야 할 부분이 없나 생각했다. 그러다보니 속도가 좀 느려지는 것 같기도 했지만 공부가 되는 것 같아서 좋았다.
- pthread_create() 를 통해서 새로운 쓰레드를 생성할때, 쓰레드가 실행할 함수의 포인터를 전달해주게 된다. 이와 관련해서 함수의 포인터 개념을 질문하고 공부했는데, 변수와 동일하게 생각하니 이해하기가 수월했다. 또한 (void *) 에 대해서도 알아 보았는데, 타입을 통용하는 그냥 포인터로 이해했다. C언어에서 포인터의 타입이 필요한 경우는 오직 한가지가 있는데, + - 연산을 할때, 얼마만큼을 더할 것인지를 타입에 따라서 결정하게 된다.
- 소켓에 데이터를 전송하고 받을때, recv, send 그리고 shutdown()함수의 역할에 대해서 고민해 보았다. 소켓은 읽기와 쓰기 두가지의 경로로 이루어져 있기 때문에, shutdown을 통해서 한쪽 통로를 닫을 수있다. 소켓의 모드에 따라서 데이터를 전송했을때 바로 보내지는 경우가 있고, 버퍼에 모았다가 한번에 보내는 경우가 있다. 사실 아직 sync와 async의 개념이 잘 잡히지 않는다.. 또 내가 발견한 점은 recv 함수가 소켓에 무언가가 send 될때까지 기다린 다는 점이다. 이게 앞전에 다루던 file i/o와는 조금 다른 것 같아서 찾아보니 blocking 모드와 nonblocking 모드가 있다고 한다. 이 개념들이 아직 머리속에 잘 정리가 되지않는다.
- C에서는 call by value 개념만 존재한다. 그렇다면 call by reference, reference 란 무엇일까? reference는 심볼에서 값으로 가는 관계를 말한다. 지난 방학때 교수님이 올려주신 강의를 통해서 이 개념들을 접했었는데, 이렇게 다시 생각해보니 아직 명확하지가 않았다. 그래서 그당시에 노트에 기록해 두었던 내용들을 다시 보면서 잠깐이나마 공부 해 보았다. c에서 함수가 call 되면, 파라미터의 값을 복사해서 줄 뿐, 실질적으로 같은 메모리 공간을 공유하지 않는다! 이 말이 이해가 되니까 어느정도 감이 생기는 것 같다. 하지만 시간을 내서 강의를 다시 듣고 더 확실하게 이 내용들을 내 것으로 가져가야 겠다는 생각이 든다.