구)홈페이지 오탈자 보기
TCP/IP 소켓 프로그래밍

 

페이지오탈자 내용등록일
28

(p. 28 마지막 문단)

PATH로 등록되지 않는 디렉토리의 파일을 실행하려면 경로를 명시적으로 지정(상대/절대 경로 형식으로)해야 하는 것은 유닉스/리눅스 환경이나 윈도우/도스 환경이 다르지 않습니다.
유닉스/리눅스 환경에서는 일반적으로 "현재 디렉토리가 PATH에 등록되지 않는다"는 점이 다를 뿐입니다.
==>
확인중

2006-10-251
41

(p. 41 밑에서 두번째 문단 마지막 줄)

브리지에 의해
==>
브리지로

2006-10-251
69

((p 69) 첫째줄)

어셈블리 과정
->단편화(fragmentation) 과정 
으로 수정해야 합니다.
거의 모든 원서나 번역서에서도 이렇게 표현하고 있으며, assembly는 조립한다는 의미를 가지므로 적절한 표현이 못됩니다.
==>
확인중

2006-10-251
69

((p 69) [그림 2-27] 단편화 된 세번째 패킷 부분)

358바이트

-> 356바이트로 수정 
총 바이트 1380바이트 = 512바이트 + 512바이트 + 356바이트 입니다.
==>
확인중

2006-10-251
70

((p 70) 두번째 문단 네째줄)

TTL 값을 255 또는 127로 설정하게 된다.
->TTL 값을 255또는 128로 설정하게 된다.

윈도우즈 시스템의 경우 TTL값이 128이 됩니다.
==>
확인 중

2006-10-251
80

((p 80) 그림 2-38)

네트워크 C에서 호스트의 IP가 3.3.3.1000으로 표기되었습니다.
3.3.3.100으로 수정해야 합니다.
==>
확인 중

2006-10-251
93

((p 93) 세번째 문단 첫째줄)

운영체제에서 IP 헤더를 붙였다면 이제 네트워크 디바이스 드라이브가....

-> 디바이스 드라이브가 아니라 디바이스 드라이버입니다.
==>
운영체제에서 IP 헤더를 붙였다면 이제 네트워크 디바이스 드라이버가....

2006-10-251
95

((p 95) 첫번째 문단)

첫번째 문단에 나오는 모든 "디바이스 드라이브"를.
==>
"디바이스 드라이버"로 수정합니다.

2006-10-251
99

((p 99) 밑에서 2번째 줄)

APR -> ARP 로 수정해야 합니다
==>
확인중

2006-10-251
128

((p 128) 네번째 문단 첫째줄)

매일매일 패킷을 보내고 전화로 확인하는 과정을...
==>
매일매일 소포를 보내고 전화로 확인하는 과정을...

2006-10-251
144

((p 144) close 함수 설명 부분)

close 함수는 파일 디스크립터를 닫는다. 닫힌 파일 디스크립터는 더 이상 참조되거나 사용될 수 없다. 연결에 성공하면 0을 반환하고...

-> "연결에 성공하면"이 아니라 "닫기에 성공하면" 이라고 수정해야 합니다.
==>
확인 중

2006-10-251
149

((p 149) listen 함수 설명 부분)

해당 소켓에서 연결을 기다린다. 연결은 큐의 길이만큼만 가능하며 일반적으로 5를 많이 사용한다. 연결에 성공하면 0을 반환하고...

-> "연결에 성공하면"을 "성공하면"으로 수정해야 합니다. listen 함수는 연결해주는 함수가 아닙니다.
==>
확인중

2006-10-251
150

((p 150) write 함수 설명 부분)

해당 소켓에 연결 요청이 들어왔을 때 연결을 받아들인다....

-> 전제 문장을 다시 고쳐야 합니다. 현재 설명은 write 함수에 대한 설명이 아니라 accept 함수에 대한 설명입니다.
==>
확인 중

2006-10-251
151

((p 151) close 함수 설명 부분)

close 함수는 파일 디스크립터를 닫는다. 닫혀진 파일 디스크립터는 더 이상 어떤 파일에 의해서 참조되거나 사용될 수 없다. 연결에 성공하면...

-> "연결에 성공하면"을 "닫기에 성공하면"으로 수정해야 합니다.
==>
확인 중

2006-10-251
157

((p 157) 첫번째 문단 둘째줄, 네번째 문단 첫째줄, 다섯번째 문단 다섯째줄, 그림 5-3)

우리가 만들어 볼 프로그램은 클라이언트가 서버에 접속하면 서버가 클라이언트에게 UDP를 이용해서 "I miss you already"라는 데이터를 전송해주고 클라이언트는 데이터를 받은 후 다시 "I miss you"라는 데이터를 서버에 전송해주고 접속을 종료하는 프로그램이다.

-> 우리가 만들어 볼 프로그램은 클라이언트가 UDP를 이용해서 "I mis you already"라는 데이터를 전송해주고 서버는 데이터를 받은 후 다시 "I miss you"라는 데이터를 클라이언트에 전송해주고 접속을 종료하는 프로그램이다.



UDP 클라이언트로부터 데이터가 수신되었다면(우리 서버에서는 "I miss you already" 데이터가 전송될 것이다)

-> UDP 클라이언트로부터 데이터가 수신되었다면(우리 서버에서는 "I miss you already" 데이터를 수신할 것이다)



문자열 "I miss you"를 전송하는 것으로 하겠다.

-> 문자열 "I miss you already"를 전송하는 것으로 하겠다.


그림 5-3에서 윗부분의 패킷 내용으로 "I miss you already"을 "I miss you"로 수정하고 아랫부분의 패킷 내용으로 "I miss you"를 "I miss you already"로 수정해야 합니다. 혹은 두 개의 화살표 방향을 반대로 바꿔야 합니다.
==>
확인중

2006-10-251
160

(P160)

UDP에서는 연결관리를 하지 않기 때문에 connect 함수를 사용하지 않는다는...

->UDP오 connect 함수를 사용 할 수도 있는 것으로 아는데요.
UDP에서의 connect는 bind의 역할과 같다고 봅니다.
connect를 하게 되면 recvfrom, sendto  뿐 아니라.. read, write를 쓸수가 있지요.
==>
확인중(2006년 7월 25일, 임성춘)

2006-10-251
161

((p 161) 36라인)

저자주

36 라인에 다음 라인이 빠졌습니다.
clen = sizeof(client_addr);

추가 시키시길 바랍니다.
==>
확인중

2006-10-251
162

((p 162) 세번째 문단 첫째줄)

struct sockaddr_in 구조체형 client_addr 변수에는 UDP 데이터를 수신할 때 데이터를 전송한 클라이언트의 주소를 받게 되고 server_addr 변수에는...

-> struct sockaddr_in 구조체형 client_addr 변수에는 UDP 데이터를 수신할 때 데이터를 전송한 서버의 주소를 받게 되고 server_addr 변수에는...

부가 설명 : client_addr 변수는 받은 패킷으로부터 전송한 호스트의 주소 정보를 저장하기 위해 사용하는 구조체 변수입니다.
==>
확인 중

2006-10-251
168

((p 168) 36라인)

저자주

36 라인에 다음 라인이 빠졌습니다.
clen = sizeof(client_addr); 

추가 시키기 바랍니다.
==>
확인중

2006-10-251
179

(p. 179 첫 문단 마지막 줄)

디바이스 드라이브 -> 디바이스 드라이버
==>
확인중

2006-10-251
183

(p. 183 예제 43 line)

성공 종료 시에는 관례대로 0을 리턴하는 것이 좋을 것 같습니다.
return 1; --> return 0;
==>
확인중

2006-10-251
188

(p 188 22~23행 설명 마지막 문장)

getpid는 자신의 부모 프로세스의 pid를...
->
getppid는 자신의 부모 프로세스의 pid를...
==>
확인 중

2006-10-251
211

(p 211 [그림 6-22])

그림 6-22가 누락되었습니다.
==>
대단히 죄송합니다. 2쇄 수정 과정에서 누락된 것으로 보입니다.
아래 사이트에 211page.pdf 파일로 올렸습니다.

http://www.hanbitbook.co.kr/web/example/1333/

2006-10-251
216

(p 216 예제 6-8 line 04)

04 #include <fcntl.h>
05 #include <fcntl.h>

같은 라인이 중복 입력되었습니다.
==>
확인중

2006-10-251
221

(p 221 마지막 줄)

pre 프로세스 기법
->
pre-forking 기법 또는 pre-forked server 기법
==>
확인중

2006-10-251
224

((p 224) pthread_create 함수 설명에서 네번째 인자)

4. arg : 스레드 실행 함수는 start_routine에 넘길 함수 인자다.

-> 4. arg : start_routine에 넘길 함수 인자다.
혹은 실행될 스레드 함수 start_routine에 넘길 함수 인자다.
==>
확인 중

2006-10-251
224

(p 224 pthread_create 함수)

함수 프로토타입 부분에서 헤더 파일이 잘못 표기되었습니다
pthrad.h -> pthread.h
==>
확인중(2006년 10월 12일)

2006-10-251
225

((p 225) pthread_exit 함수 설명 부분)

pthread_detach 함수와 같이 스레드를 종료하는 함수다.

-> 스레드를 종료하는 함수다.

pthread_datach는 스레드를 분리시키는 함수이지 종료하는 함수가 아닙니다.
==>
확인중

2006-10-251
6230

(p 230)

pthread_mutex_destory -> pthread_mutex_destroy

2006-11-082
240

(p 240 Line 25)

서버 옵션 지정 -> 서버 주소 지정
==>
확인중

2006-10-251
246

((p 246) 첫번째 문단 세째줄)

클라이언트에서 재전송해주는 작업을 반복한다.

-> 클라이언트에게 재전송해주는 작업을 반복한다.
==>
확인중

2006-10-251
247

(p 247 첫번째 문장)

부모 프로세스를 -> 부모 프로세스가 또는 부모 프로세스에서
==>
확인중

2006-10-251
261

((p 261) pthread_create 함수 설명 부분에서 세째줄)

새로운 스레드를 생성하고 지정된 함수를 호출해서 생성된 스레드에서 pthread_create 함수를 실행시킨다.

-> 새로운 스레드를 생성하고, 생성된 스레드는 지정된 함수를 수행한다.
==>
확인 중

2006-10-251
267

((p 267) 75번 라인의 코드)

printf("새로운 클라이언트 %d번 파일 디스크립터 접속
", csock, csock);

->printf("새로운 클라이언트 %d번 파일 디스크립터 접속
", csock);
==>
확인 중

2006-10-251
269

((p 269) 함수 설명 부분에서 좌측의 함수 이름, 셋째줄)

socket 함수

-> select 함수



첫 번째 디스크립터에는 감시할 파일 디스크립터의 크기를 지정한다.

-> 첫 번째 인자에는 감시할 파일 디스크립터의 크기를 지정한다.
==>
확인 중

2006-10-251
269

((p 269) 함수 설명 부분에서 좌측의 함수 이름, 셋째줄)

socket 함수

-> select 함수



첫 번째 디스크립터에는 감시할 파일 디스크립터의 크기를 지정한다.

-> 첫 번째 인자에는 감시할 파일 디스크립터의 크기를 지정한다.
==>
확인 중

2006-10-251
271

((p 271) 75번 라인 코드)

printf("새로운 클라이언트 %d번 파일 디스크립터 접속
", csock, csock);

-> printf("새로운 클라이언트 %d번 파일 디스크립터 접속
", csock);
==>
확인 중

2006-10-251
6281

(281쪽 브로드캐스팅 예제(sock_broadcast.c))

예제소스에 "int sockfd;"를 추가

2008-10-011
292

((p 292) 첫번째 문단 첫째줄)

종료를 요청한 쪽에서는 ACK 메시지를 보내고...

-> 종료를 요청한 쪽에서는 FIN 메시지를 보내고
==>
확인 중

2006-10-251
303

((p 303) 위에서 4번째 줄)

Server Type
==>
Service Type

2006-10-251
319

((p 319~320) 27행 ~ 39행 설명 부분)

디바이스 드라이브
==>
디바이스 드라이버

2006-10-251
416

(416p 맨 윗 문단 소스 코드)

void CTestUIThreadDlg::OnTmBlockingCall() 
{
// TODO: Add your control notification handler code here
m_pThread->PostThreadMessage( TM_MESSAGE_BOX, 0, 0);

}
==>
void CTestThreadDlg::OnTmBlockingCall() 
{
// TODO: Add your control notification handler code here
m_pThread->PostThreadMessage( TM_BLOCKING_CALL, 0, 0 );
}

2006-10-251
447

((p 447) 5번째 문단 두번째 문장)

동작 결과를 통보하는 WSEventSelect 방식이다.
==>
동작 결과를 통보하는 WSAEventSelect 방식이다.

2006-10-251
12485

(p485 2번째 문단 3째줄)

사용해야 하므로 CEventSelect 안에서 스레드를
==>
사용해야 하므로 CEventSocket 안에서 스레드를

(확인중: 2007년 2월 20일)

2007-02-021
12488

(p488 첫번째 문단)

7. 다음으로 CEventSocket.cpp 헤더를 작성한다.
==>
7. 다음으로 EventSocket.cpp 소스를 작성한다.

(확인중: 2007년 2월 22일)

2007-02-021
559

((p 559) 두번째 문단 첫째줄)

일반 시그널에서의 signo대신에 siginfo_t라는...

-> 일반 시그널에서의 signo와 함께 siginfo_t라는
==>
확인중

2006-10-251
559

((p 559) siginfo_t 정의에서 11번째줄)

int _band;
int _fd;

-> 
int si_band;
int si_fd;
==>
확인중

2006-10-251
560

((p 560) 첫번째 문단 첫째줄)

예를 들어, sigval_int에 이벤트가...
==>
예를 들어, sival_int에 이벤트가...

2006-10-251
561

((p 561) 30행~33행 설명 부분에서 첫째줄)

32행에 sa_flags 값으로...
==>
31행에 sa_flags 값으로...

2006-10-251
561

((p 561) 6행~21행 설명 부분에서 셋째줄)

이는 32행 이후의 시그널이...
==>
이는 32번 이후의 시그널이...

2006-10-251
563

((p 563) 그림 14-7)

Sig Number 35

-> Sig Number 32

리눅스에서 SIGRTMIN은 시그널 번호가 32번입니다.
==>
확인중

2006-10-251
14564

(p564 & p565)

 함수 설명에서 sigtimedwait 함수를 sigtimewait 함수라고 표기된 부분이 여럿 나옵니다. 

(확인중)

2007-02-031
566

((p 566) 26~27 라인, 36~37 라인)

26~27라인과 36~37라인의 주석이 서로 바뀌어야 합니다.
==>
확인중

2006-10-251
574

((p 574) 밑에서 첫째줄)

여기서 중요한 것은 두 번째 인자인 op와 세 번째 인자인 epoll_event 구조체다.
==>
여기서 중요한 것은 두 번째 인자인 op와 네 번째 인자인 epoll_event 구조체다.

2006-10-251
616

((p 616))

코드 첫, 둘째 줄
wbuf[0].buf = pHeader;
wbuf[0].len = 30;

wbuf[1].buf = pContents;
wbuf[1].len = 30;
으로


[그림 16-8] WSASend 함수 호출 시 버퍼 구조 중
두번 째 "Len = 20 " 을 "Len = 30" 으로



아래 코드의 7, 8 행에서
wbuf[0].buf = pHeader;
wbuf[0].len = 30;

wbuf[1].buf = pContents;
wbuf[1].len = 30;
으로
==>
확인중

2006-10-251
691

(p 691 수신코드 마지막줄)

recv(sockfd,&sizeBuf,2,0);   // 데이터 길이(2Byte)를 읽어 들인다.
packetSize=memcpy(&packetSize,&sizeBuf[0],2);
// 데이터 길이를 저장한다.
recv(sockfd,&dataBuf,packetSize,0);
// 데이터 버퍼에 데이터 길이만큼 읽어 들인다.

위를 다음과 같이 수정합니다.

recv(sockfd,sizeBuf,2,0);   // 데이터 길이(2Byte)를 읽어 들인다.
memcpy(&packetSize,&sizeBuf[0],2);
// 데이터 길이를 저장한다.
recv(sockfd,dataBuf,packetSize,0);
// 데이터 버퍼에 데이터 길이만큼 읽어 들인다.
==>
확인중

2006-10-251