목차
1장 네트워크 프로그래밍 이해
   장치들을 하나로 연결해주는 네트워크 ... 18
      네트워크 이해하기 ... 18
      네트워크의 네트워크 인터넷 ... 19
   네트워크 프로그래밍과 소켓 프로그래밍 ... 21
      네트워크 프로그래밍 ... 21
      서버와 클라이언트를 연결해주는 소켓 ... 23
   소켓 프로그램의 이해 ... 23
      삼순이 서버와 삼식이 클라이언트 동시에 살펴보기 ... 24
      삼순이 서버의 구현 ... 25
      삼식이 클라이언트 소켓의 구현 ... 33
   중요 개념 ... 35
      윈도우 환경에서 쉽게 리눅스 사용하기 ... 35
      따라하기 : ... 35
      Cygwin에서 C언어 프로그램 작성하고 실행하기 ... 43
      따라하기 : ... 43
2장 처음으로 만드는 리눅스 기반의 소켓프로그램
   데이터의 흐름 스트림 ... 51
   스트림을 이용해서 파일 입출력하기 ... 53
      데이터의 파이프 스트림 연결하기 ... 53
      파이프 끊기 - 스트림의 종료 ... 54
      파일로 데이터 출력 ... 55
      예제 : 파일 data.txt로 메시지를 전송하는 예제 : file_write.c ... 55
      파일의 데이터 읽어 들이기 ... 57
      예제 : data.txt의 내용을 읽어들여서 화면에 출력하는 예제 : file_read.c ... 57
      스트림과 소켓과의 관계 ... 59
   처음으로 만드는 리눅스 기반의 서버 프로그램 ... 59
      서버 소켓의 생성 ... 60
      소켓에 주소 알려주기 ... 61
      클라이언트의 접속을 기다리는 대기모드로 전환 ... 62
      클라이언트의 접속을 수락 ... 63
      클라이언트의 메시지 읽어 들이기 ... 64
      클라이언트로 메시지 전송하기 ... 65
      클라이언트와의 연결 종료 ... 65
      예제 : 리눅스 기반의 서버 예제 : linux_server.c ... 66
   리눅스 기반의 클라이언트 프로그램 작성 ... 67
      서버와 접속해서 스트림 만들기 ... 68
      예제 : 리눅스 기반의 클라이언트 예제 : linux_client.c ... 69
3장 처음으로 만드는 윈도우 기반의 소켓프로그램
   윈도우 소켓에 대해서 ... 71
   윈도우 소켓을 이용해서 서버 프로그램 작성하기 ... 72
      프로그램 어떻게 작성할까? ... 72
      따라하기 : ... 72
      예제 : 윈도우 기반의 소켓 서버 예제 : server.cpp ... 75
      원도우 소켓의 초기화와 종료 ... 77
      소켓의 생성 ... 78
      소켓에 IP와 PORT 설정 ... 79
      클라이언트의 접속을 기다림 ... 80
      클라이언트의 접속을 수락 ... 81
      클라이언트가 전송한 데이터 읽어 들이기 ... 82
      클라이언트로 데이터 전송하기 ... 82
      소켓 종료하기 ... 83
   윈도우 소켓을 이용해서 클라이언트 작성하기 ... 84
      따라하기 : ... 84
      예제 : 윈도우 기반의 소켓 클라이언트 예제 : client.cpp ... 87
      서버에 접속하기 ... 90
4장 프로토콜의 제어와 주소 체계
   서버와 클라이언트의 약속 프로토콜 ... 91
      클라이언트와 서버의 프로토콜 ... 91
      소켓의 생성과 프로토콜 ... 92
      프로토콜의 주소체계 ... 92
      소켓의 타입 ... 93
      소켓의 프로토콜 ... 96
      예제 : 리눅스 운영체제에서 TCP 프로토콜의 소켓과 UDP 프로토를의 소켓 생성예제 : socketinit.c ... 97
      예제 : 윈도우 운영체제에서 TCP 프로토콜의 소켓과 UDP 프로토콜의 소켓을 생성한 예제 : winsockinit.c ... 98
   주소 어떻게 처리할 것인가? 소켓의 주소 체계 ... 100
      주소를 어디에 저장할 것인가? 주소 구조체 ... 100
      데이터 저장 순서 빅 엔디안과 리틀 엔디안 ... 101
      예제 : 리눅스 기반의 네트워크 바이트 정렬과 호스트 바이트 정렬에 관한 예제 : endianConvert.c ... 103
      예제 : 윈도우 기반에서 네트워크 바이트 정렬과 호스트 바이트 정렬에 관한 예제 : endianConvertWin.c ... 104
      IP 주소를 문자열로 32비트로 변환 ... 106
      예제 : 리눅스 기반의 IP 주소 변환 예제 ipConvert.c ... 106
      예제 : 윈도우 기반의 IP 주소 변환 ipConvertWin.c ... 108
5장 숫자 야구 게임을 이용한 TCP 기반의 소켓 프로그램 작성
   야구 게임 서버의 클라이언트 입력 읽는 부분 작성 ... 109
      예제 : 리눅스기반 숫자 야구 게임 서버에서 클라이언트가 입력한 숫자를 읽어들이는 예제 : baseballServer1.cpp ... 110
   숫자 야구 게임 클라이언트의 서버로 숫자 전송하는 부분 작성 ... 114
      예제 : 리눅스 기반 야구 게임 클라이언트에서 서버로 숫자 전송 예제 : baseballClient1.cpp ... 114
   숫자 야구게임 서버와 클라이언트같이 살펴보기 ... 116
   서버의 스트라이크 볼 판별 하는 부분 추가해서 서버 완성 ... 116
      예제 : 리눅스 기반 야구 게임 서버에서 스트라이크와 볼 판별 예제 : baseballServer2.cpp ... 117
   스트라이크와 볼의 개수 읽어 들여서 클라이언트 완성 ... 120
      예제 : 서버에서 전송한 스트라이크와 볼 읽어들이는 예제 : baseballClient2.cpp ... 120
   숫자 야구 게임 서버와 클라이언트를 윈도우 기반의 프로그램으로 수정하기 ... 122
      예제 : 숫자 야구 게임 서버 : baseballServerWin.cpp ... 122
      예제 : 숫자 야구 게임 서버 : baseballClientWin.cpp ... 125
6장 멀티 스레드를 이용해서 한번에 여러 가지 작업 수행하기
   스레드에 대해서 ... 127
   멀티 스레드 프로그램을 만들자 ... 128
      예제 : 단일 스레드 프로그램인 예제 : unthread.cpp ... 128
      예제 : pthread_create 함수를 이용해서 go와 come 함수를 실행 하려고 하나 잘 안되는 예제 : thrad0.cpp ... 130
      예제 : go와 come이 종료할 때까지 main이 대기하도록 설정한 예제 : thread1.cpp ... 133
   자원의 공유 때문에 생기는 문제점 ... 134
      예제 : 자원 공유 시 예상치 못한 결과가 나타나는 프로그램 예제 : thread2.cpp ... 135
   하나의 스레드만 공유자원에 접근 가능하게 하는 뮤텍스를 이용한 동기화 ... 138
      예제 : 뮤텍스에 의해서 하나의 공유 자원만 접근 가능하도록 설정한 예제 : thread3.cpp ... 140
   스레드의 실행순서를 제어하는 세마포어를 이용한 동기화 ... 142
      예제 : 뮤텍스로 동기화 했지만 스레드의 순서를 제어 하지 못한 예제 : thread4.cpp ... 143
      예제 : pop 함수를 실행하기 전에 반드시 push 먼저 실행하도록 세마포어를 이용한 예제 : thread5.cpp ... 146
      예제 : 하나 이상의 세마포어를 사용해서 push와 pop이 번갈아 실행되도록 작성된 예제 : thread6.cpp ... 149
7장 여러 명이 즐기는 숫자 야구 게임 작성하기
   여러 명의 클라이언트를 처리하는 이터렉티브 서버 구현하기 ... 151
      예제 : 하나 이상의 클라이언트를 처리하는 서버 예제 : iteractiveServer.cpp ... 152
      예제 : 이터렉티브 서버에 메시지를 보내는 클라이언트 예제 : iteractiveClient.cpp ... 154
   이터렉티브 서버와 멀티 스레드를 이용한 여러 명이 함께 즐기는 숫자 야구 게임 만들기 ... 155
      예제 : 여러 명이 하는 숫자 야구 게임 서버 예제 : baseballServer.cpp ... 156
      예제 : 예제 숫자 야구 게임 클라이언트 예제 : baseballClient.cpp ... 161
8장 윈도우에서 멀티 스레드 구현하기
   프로세스와 스레드 ... 165
      따라하기 : ... 165
   스레드의 생성과 종료 ... 167
      예제 : CreateThread 함수를 이용해서 멀티 스레드를 생성한 예제 : WinThread01.cpp ... 168
   조금 더 안전한 스레드 생성하기 ... 170
      예제 : _beginthreadex 함수를 이용해서 멀티 스레드 환경에서 보다 안전한 스레드를 생성한 예제 : WinThread02.cpp ... 171
      따라하기 : ... 172
   다른 스레드가 끝날 때까지 대기 하도록 하는 함수 WaitForSingleObject와 WaitForMultipleObjects ... 174
      예제 : WaitForSingleObject 함수를 이용해서 다른 스레드가 종료할 때까지 main 함수를 대기하도록 설정한 예제 : WinThrea03.cpp ... 175
      예제 : WaitForMultipleObjects를 이용해서 두 개의 스레드가 끝날 때까지 main 함수가 대기하도록 설정한 예제 : WinThread04.cpp ... 177
9장 숫자 야구 게임 만들기
   스레드의 동기화 ... 180
   공유 자원에 하나의 스레드만 접근하도록 하는 뮤텍스 ... 181
      예제 : 뮤텍스를 이용해서 공유자원을 동기화시켜서 한번에 하나의 스레드에서만 공유 자원에 접근하도록 설정한 예제 WinMutex.cpp ... 183
   스레드의 실행 순서를 제어하는 세마포어 ... 185
      예제 : 세마포어를 이용해서 pop 하기 전에 반드시 push 하도록 설정한 예제 : semapore1.cpp ... 187
   하나 이상의 스레드의 대기 상태를 풀어주는 이벤트 ... 189
      예제 : 하나의 스레드에 대해서만 대기 상태를 풀어줄 수 있는 세마포어를 이용한 예제 : event1.cpp ... 189
      예제 : 수동 이벤트에서 ResetEvent 함수를 호출하지 않아서 비신호 상태로 되지 않는 예제 : event2.cpp ... 194
      예제 : ResetEvent 함수를 이용해서 이벤트를 비신호 상태로 변환한 예제 : event3.cpp ... 196
   멀티 스레드와 이터렉티브 서버를 이용해 윈도우 기반의 멀티 숫자 야구 게임 만들기 ... 198
      예제 : 윈도우 기반의 숫자 야구 게임 서버 예제 : WinBaseballServer.cpp ... 198
      예제 : 윈도우 기반의 숫자 야구 게임 클라이언트 예제 : WinBaseballClient.cpp ... 201
10장 채팅 프로그램 만들기
   채팅 서버 만들기 ... 204
      채팅 서버 프로그램 만들기 1단계 : 이터렉티브 서버 만들기 ... 205
      예제 : 채팅 프로그램의 서버 부분인 chattingServer.cpp의 main 함수를 구현한 부분 ... 206
      채팅 서버 만들기 2단계 : 클라이언트의 메시지를 읽어 들여서 전체 클라이언트로 전송하는 broadcastAllClient 함수 구현하기 ... 209
      예제 : 현재 클라이언트가 전송한 메시지를 읽어 들여서 전체 클라이언트로 전송하는 broadcastAllClient 함수를 구현한 부분 ... 210
      채팅 서버 만들기 3단계 : 완성된 채팅 서버 chattingServer.cpp ... 212
      예제 : 완성된 채팅 서버 예제 : chattingServer.cpp ... 212
   채팅 클라이언트 만들기 ... 216
      채팅 클라이언트 만들기 1단계 : 서버에 접속하는 main 함수 만들기 ... 216
      예제 : 채팅 서버에 접속하고 sendMessage와 receiveMessage 함수를 멀티 스레드로 시작하는 main 함수 ... 217
      채팅 클라이언트 만들기 2단계 : 키보드 입력을 읽어 들여서 서버로 전송하는 sendMessage 함수 만들기 ... 218
      예제 : 클라이언트의 키보드 입력을 읽어 들여서 서버로 전송하는 sendMessage 함수 ... 219
      채팅 클라이언트 만들기 3단계 : 서버에서 전달된 다른 클라이언트의 메시지를 화면에 출력하는 receiveMessage ... 220
      예제 : 서버에서 전달받은 다른 클라이언트의 메시지를 화면에 출력하는 receiveMessage 함수 ... 220
      채팅 클라이언트 만들기 4단계 : 채팅 클라이언트 완성 ... 221
      예제 : 클라이언트 부분이 모두 완성된 예제 : chattingClient.cpp ... 221
11장 UDP 프로토콜의 소켓 프로그래밍
   먼저 연결하고 메시지를 주고받는 TCP 프로토콜의 소켓 ... 225
   연결하지 않고 메시지를 전송하는 UDP 소켓 ... 226
   연결하지 않고 메시지를 전송하는 UDP 소켓의 함수 ... 228
   서버와 연결하는 connect 함수가 없는 UDP 소켓을 이용한 서버와 클라이언트 프로그램 작성하기 ... 230
      예제 : UDP 소켓 서버 udpServer.cpp ... 231
      예제 : UDP 프로토콜로 데이터를 전송하는 UDP 클라이언트 프로그램 udpClient.cpp ... 232
   윈도우 환경에서 UDP 소켓을 이용한 서버와 클라이언트 프로그램 작성하기 ... 233
      예제 : 윈도우 환경에서 UDP 소켓 서버 프로그램 WinUDPServer.cpp ... 233
      예제 : 윈도우 환경에서 UDP 클라이언트 프로그램 WinUDPClient.cpp ... 235
   연결은 안하지만 서버의 정보를 기억하고 있는 connect() 함수 ... 236
      예제 : connect 함수를 이용해서 서버에 메시지를 전송하는 udpClient2.cpp ... 238
   윈도우 환경에서 connect 함수를 이용한 UDP 소켓 클라이언트 프로그램 ... 239
      예제 : 윈도우 환경에서 connect 함수를 이용해서 서버의 정보를 기억하는 UDP 클라이언트 프로그램 WinUDPClient2.cpp ... 240
   UDP 소켓을 이용한 현재 시간을 알려주는 시계 프로그램 만들기 ... 241
      예제 : 클라이언트의 요청이 있을 때마다 현재 시간을 알려주는 UDP 서버 프로그램 daytimeServer.cpp ... 241
      예제 : 1초마다 서버에 현재 시간을 물어보는 UDP 클라이언트 daytimeClient.cpp ... 243
12장 멀티 캐스트와 브로드캐스트
   나는야 스피커! 한번만 보냈는데 모두에게 전파되는 멀티 캐스트 ... 245
   한번만 전송한다! 멀티 캐스트 방식의 메시지 전송자 작성하기 ... 247
      멀티 캐스트 방식의 전송자의 프로그램 흐름 ... 247
      현재 시간을 1초마다 전송하는 멀티 캐스트 방식의 메시지 전송자(Sender) 예제 ... 250
      예제 : 현재 시간을 1초마다 중간 전송자를 전송하는 multicastSender.cpp ... 250
   복사된 메시지가 전달된다! 멀티 캐스트 방식의 메시지 수신자 작성하기 ... 251
      멀티 캐스트 방식의 메시지 수신자의 프로그램 흐름 ... 251
      멀티 캐스트 수신자가 전송한 메시지를 읽어 들이는 멀티 캐스트 수신자 프로그램의 예제 ... 253
      예제 : 멀티 캐스트 전송자가 전송한 메시지를 읽어 들이는 멀티 캐스트 수신자 예제 : multicastReceiver.cpp ... 253
   윈도우 기반에서 멀티 캐스트 프로그램 작성하기 ... 254
      예제 : 1초마다 중간 경유지로 현재 시간을 전송하는 멀티캐스트 전송자 multicastSender.cpp를 윈도우 기반으로 수정한 WinMulticastSender.cpp ... 255
      예제 : 멀티캐스트 방식으로 전송되는 메시지를 읽어 들여서 화면에 현재 시간을 표시하는 multicastReceiver.cpp를 윈도우 기반으로 수정한 WinMulticastReceiver.cpp ... 256
   같은 네트워크에서만 실행되는 멀티캐스트의 특별한 예 브로드캐스트 ... 258
   같은 네트워크의 모든 객체로 메시지를 전송하는 브로드캐스트 방식의 전송자 작성하기 ... 259
      브로드캐스트 방식의 메시지 전송 프로그램의 실행 순서 ... 259
      브로드 캐스트 메시지 전송자 작성하기 ... 261
      예제 : 같은 네트워크에 연결된 전체 수신자에게 1초마다 현재 시간을 전송하는 브로드캐스트 전송자 broadcastSender.cpp ... 261
   브로드캐스트 전송자로부터 메시지를 읽어 들이는 브로드캐스트 수신자 작성하기 ... 263
      예제 : 브로드 캐스트 방식으로 전송된 메시지를 읽어 들이는 브로드캐스트 방식의 메시지 수신자 broadcastReceiver.cpp ... 263
   윈도우 기반의 브로드 캐스트 프로그램 작성하기 ... 264
      예제 : 같은 네트워크의 모든 개체로 1초마다 현재 시간을 전송하는 broadcastSender.cpp를 윈도우 기반으로 수정한 WinBroadcastSender.cpp ... 265
      예제 : 브로드캐스트 전송자가 전송하는 메시지를 읽어 들여서 화면에 출력하는 브로드 캐스트 수신자 broadcastReceiver.cpp를 윈도우 기반으로 수정한 WinBroadcastReceiver.cpp ... 266
13장 소켓의 다양한 옵션(1)
   내 맘대로 바꾼다. 소켓의 옵션에 대해서 ... 268
      예제 : 리눅스 기반의 소켓이 TCP 소켓인지 아니면 UDP 소켓인지를 알아내는 예제 : socketOption1.cpp ... 271
      예제 : 윈도우 기반의 소켓이 TCP 소켓인지 아니면 UDP 소켓인지를 알아내는 예제 : WinSocketOption1.cpp ... 272
   송수신 버퍼의 크기를 내 맘대로 SO_SNDBUF와 SO_RCVBUF ... 273
      예제 : 리눅스 기반에서 수신 버퍼와 송신 버퍼의 크기를 2배로 늘리는 socketOption2.cpp ... 274
      예제 : 윈도우 기반에서 송신 버퍼와 수신 버퍼의 크기를 알아내고 송신 버퍼와 수신 버퍼의 크기를 2배 증가시키는 예제 : WinSocketOption2.cpp ... 276
   라우팅 테이블을 보지 않고 메시지를 전송하는 SO_DONTROUTE ... 278
      예제 : 리눅스 환경에서 SO_DONTROUTE 옵션을 설정한 예제 : dontroute.cpp ... 279
      예제 : 윈도우 기반에서 라우팅 테이블을 참조 하지 않고 메시지를 전송하는 SO_DONTROUTE 옵션을 설정한 dontroute.cpp를 윈도우 기반으로 수정한 예제 : WinDontRoute.cpp ... 280
   주기적으로 연결을 검사하는 SO_KEEPALIVE ... 282
      예제 : SO_KEEPALIVE 옵션을 설정한 서버 프로그램 예제 : keepaliveServer.cpp ... 283
      예제 : SO_KEEPALIVE 옵션이 설정된 서버 프로그램 keepaliveServer.cpp에 접속하는 클라이언트 프로그램 keepaliveClient.cpp ... 285
      예제 : 윈도우 기반의 SO_KEEPALIVE 옵션 설정한 서버소켓 예제 : WinKeepaliveServer.cpp ... 286
      예제 : 윈도우 기반의 SO_KEEPALIVE 옵션이 설정된 서버소켓 WinKeepaliveServer에 접속하는 클라이언트 WinKeepaliveClient.cpp ... 289
14장 소켓의 다양한 옵션(2)
   못다 보낸 메시지를 어떻게 할 것인가? SO_LINGER ... 291
      예제 : SO_LINGER 옵션을 설정해서 close() 함수를 호출할 때 못다 보낸 메시지가 있다면 메시지를 전송하고 10초 후에 소켓이 종료되도록 설정한 예제 : lingerServer.cpp ... 293
      예제 : SO_LINGER 옵션을 설정해서 close() 함수 호출시 못다 보낸 메시지가 있다면 메시지를 전송하고 10초 후에 소켓이 종료되도록 설정한 예제 solingerServer.cpp에 접속하는 클라이언트 프로그램 lingerClient.cpp ... 296
      예제 : 윈도우 기반에서 SO_LINGER 옵션을 설정해서 close() 함수 호출시 못다 보낸 메시지가 있다면 메시지를 전송하고 10초 후에 소켓이 종료되도록 설정한 예제 : WinlingerServer.cpp ... 297
      예제 : 윈도우 기반에서 SO_LINGER 옵션을 설정해서 close() 함수 호출시 못다 보낸 메시지가 있다면 메시지를 전송하고 10초 후에 소켓이 종료되도록 설정한 예제 solingerServer.cpp에 접속하는 클라이언트 프로그램 WinLingerClient.cpp ... 300
   더 이상은 못 기다려!! 메시지 주고받을 때 대기 시간을 설정하는 SO_SNDTIMEO, SO_RCVTIMEO 옵션 ... 302
      주고 받는 메시지를 임시로 저장하는 전송 버퍼와 수신 버퍼 ... 302
      메시지를 전송할 때 대기시간을 설정하는 SO_SNDTIMEO ... 302
      메시지를 수신할 때 대기시간을 설정하는 SO_RECVTIMEO ... 304
   사용 중인 IP와 PORT를 재사용하자! SO_REUSEADDR ... 306
      예제 : TCP 기반의 서버 프로그램 socketOption4.cpp ... 306
      예제 : sockOption4Server.cpp에 SO_REUSEADDR 옵션을 추가한 sockOption5Server.cpp ... 309
   메시지를 모았다 보내는 Nagle 알고리즘을 하지 말까? TCP_NODELAY ... 311
      예제 : 리눅스 환경에서 TCP_NODELAY 옵션을 설정해서 NAGLE 알고리즘을 해제한 예제 : socketOption6.cpp ... 312
      예제 : 윈도우 환경에서 TCP_NODELAY 옵션을 설정해서 NAGLE 알고리즘을 해제한 예제 : WinsocketOption6.cpp ... 313
15장 IO 멀티 플렉싱
   하나의 쓰레드에서 여러 명의 클라이언트와 동시에 메시지를 전송하는 IO 멀티 플렉싱 ... 315
   혼자서 여러명의 클라이언트와의 동시에 메시지 주고받기를 처리하는 select() 함수 ... 316
select() 함수를 이용해서 하나의 쓰레드로 여러 명의 클라이언트와 동시에 메시지를 주고받는 멀티 플렉싱 서버프로그램 작성하기 ... 321
      멀티플렉싱 서버 만들기 1단계 : 서버소켓 생성하고 주소를 부여한 후에 클라이언트의
닫기