목차 일부
1장 네트워크 프로그래밍 이해
장치들을 하나로 연결해주는 네트워크 ... 18
네트워크 이해하기 ... 18
네트워크의 네트워크 인터넷 ... 19
네트워크 프로그래밍과 소켓 프로그래밍 ... 21
네트워크 프로그래밍 ... 21
서버와 클라이언트를 연결해주는 소켓 ... 23
소켓 프로그램의 이해...
더보기
목차 전체
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단계 : 서버소켓 생성하고 주소를 부여한 후에 클라이언트의
더보기 닫기