"TCP / IP 네트워크 프로그래밍"연구 노트

1.Windows 리눅스에서 프로그램을 소켓과 같은 생각하지만 세부 다소 다른
Windows에서 (1) 소켓 프로그램의 Winsock.dll 또는 WS2_32.DLL가 사전에로드해야합니다 의존하고있다. 를 참조하시기 바랍니다 DLL을로드하는 방법은 두 가지가 있습니다 : DLL 동적 링크 라이브러리의로드는
Windows가 "파일 핸들"개념을 사용하는 반면 (2) 리눅스는 "파일 설명"의 개념을 사용하며, 리눅스가 일반 파일과 소켓 파일 및 Windows 구분하지 않습니다 구별;
. (3) 리눅스 소켓에서 () 함수는 int 형의 값을 반환하고, 윈도우 즉 핸들 소켓 타입입니다.
송신 및 기능 (4) 리눅스에서 Windows 용 () / 전송 () RECV를 사용하여 읽기 및 쓰기 위해 () / 쓰기 () 함수를 읽어받을 수 있습니다.
(5) 폐쇄 소켓, 윈도우가 closesocket 함수 () 함수를 사용하는 반면, 닫기 () 함수를 사용하여 Linux.

표준 입력 표준 출력과 표준 에러 파일 디스크립터 2. 할당
파일 기술자 객체
 0 표준 출력
 한 출력 표준
 2 표준 에러
 
시스템 제공 (DLL)에 의존하는 동적 링크 라이브러리 프로그래밍 3.WinSock (윈도우 소켓), 두 가지 버전이 있습니다 :  
이전 DLL은 크기가 28킬로바이트, 해당 헤더 파일 winsock1.h입니다 WSOCK32.DLL이며,
최신 DLL이 WS2_32.DLL이며, 크기는 69킬로바이트, 해당 헤더 파일 winsock2.h입니다.
컴파일 타임에로드 사용의 #pragma 명령 :
 주석 모두 #pragma (LIB, "ws2_32.lib")
의 WinSock는 첫 번째 단계는 프로그램이로드 WS2_32.DLL이며, 다음 버전 번호를 초기화 WSAStartup에 () 함수를 호출하고 사용할 표시
WSADATA WSADATA; 
WSAStartup에 (MAKEWORD ( 2 , 2 ), WSADATA);

 

4. 소켓 프로그래밍

(1)를 소켓 () 함수를 사용하여 소켓 생성
특정의 IP 주소와 포트, 순서대로 IP 주소 및 포트를 통해 데이터 유일한 방법 흐름와 결합되는 결합 () 함수는 소켓을 이용하여 (2) 처리 소켓
(3)의 연결을 설정하기 위해 연결 () 함수를 사용하여
(4) SOCKADDR 구조가
고려 될 수 있으며, SOCKADDR 범용 구조, IP 주소와 포트 번호의 다양한 유형을 저장하는데 사용될 수 있고, 구조의 IPv4 주소를 sockaddr_in 저장하도록 설계
와 가산에서 sockaddr_in6에 IPv6 주소를 저장
(5) 사용이 기능은 수동 청취 상태로 소켓을 할 수 있습니다 () 듣기
(6) 기능은 클라이언트 요청에 응답 할 준비가 될 수있다 () 동의
(. 7) 클라이언트와 통신 할 수있는 새로운 소켓을 반환) (동의, ADDR 저장 클라이언트의 IP 주소와 포트 번호
(8) (듣기) 만 코드가 동의 () 할 때까지 계속 실행됩니다 뒤에) (듣기 상태로 소켓, 정말, 클라이언트 요청을 수신 수신하지 않습니다 수 있도록
(9) 동의 () (코드를 실행할 수 없습니다 후) 실행을 차단합니다, 때까지 새로운 요청이 들어온다.
(10) TCP 서버 함수 호출 순서 : 소켓 () -> 바인드 () - () 적용> - -> (가)) (듣기 -> 읽기 () / 쓰기 ()> 닫기 ()
(. 11)를 TCP 클라이언트 함수 호출 순서 : 소켓 () -> (연결 ) ->) (읽기 / 쓰기 () -> 닫기 ()

제 5.Ack = 서열 번호 + 송신 된 바이트의 수 + 1
 
6.
 (1)은 () / closesocket 함수 () 함수의 수단이 완전 분리 가까운, 즉, 송신 할 데이터가 없으며 호출 수신 데이터
 (2), 다른 유지하면서, 기능은 하나의 데이터 전송 채널을 해제 할 수있다 () 종료를 사용
INT 종료 ( INT의 양말, INT 하우투);  // 리눅스 
INT의 종료 (SOCKET의, INT의 하우투);  // 윈도우

분리 소켓의 필요성에 대한 양말, 하우투는 방법 꺼져

하우투 리눅스에서 값을 다음과 같은 :
  • SHUT_RD는 상기 입력 스트림을 분리. 소켓 (수신 된 데이터를 상기 입력 버퍼는 소거 된 경우에도) 데이터를 수신 할 수 있고, 관련 함수 호출을 입력 할 수 없다.
  • SHUT_WR : 출력 스트림을 분리합니다. 소켓은 데이터를 전송할 수 있지만,이 전송되지 않고, 그 대상 호스트로 전달되는 경우, 데이터 출력 버퍼.
  • SHUT_RDWR : OFF I 동안 / O 스트림. ) (2 회 종료에 대응하는 전화, 상기 SHUT_RD 다른 파라미터에 파라미터 SHUT_WR.
하우투는 Windows에서 다음과 같은 값을 가지고 :
  • SD_RECEIVE : 즉, 분리 된 입력 스트림 근접 수신 동작.
  • SD_SEND : 즉, 분리 된 출력 스트림 근접 송신 동작.
  • SD_BOTH : 동시 닫기 수신 및 전송 작업.
종료 () 대신 소켓에, 얼마나 많은 시간 종료 호출 (상관없이), 소켓 남아 당신이) (닫기 호출 할 때까지 / closesocket 함수를 (연결을 닫습니다) 닫기 () / closesocket 함수는 () 소켓을 닫습니다 호출 ()는 출력 스트림을 폐쇄 종료를 호출 할 때, 또는 다른 FIN 패킷으로 전송된다. FIN 패킷 데이터 전송 완료가 상기 컴퓨터를 통해 데이터 전송이 없을 것 알아야 할 FIN 패킷 수신
 가까운 경우에 (3) () / closesocket 함수 ()는 즉시 출력 버퍼에 관계없이 기본적으로 네트워크에 FIN 패킷을 전송 (데이터가 존재하지만, 데이터 전송 출력 버퍼 종료 ()는 손실 된 데이터를 출력 버퍼 것이다 /) (closesocket 함수 ()를 닫기를 호출 FIN 패킷 재전송 방법의 완료를 기다릴 및 통화 종료 할 )는하지 않습니다.
 
7. RECV ()가 독특한 기회를 반환하면 0 FIN 패킷을 수신
 
8. 네트워크 바이트 순서
CPU (리틀 엔디안의 인텔 제품군의 주요 CPU)를 저장하는 다양한 방법과 구문 분석 된 데이터는 구문 분석 오류 데이터는 경우 작은 엔디안과 빅 엔디안 시스템 통신 시스템을 발생합니다. 네트워크 바이트 순서 (네트워크 바이트 순서) - 따라서, 데이터를 송신하기 전에, 단일화로 데이터를 포맷한다. 통합 네트워크 바이트 순서는 빅 엔디안이다.
 
9.
핑 도메인은 도메인 이름에 해당하는 IP 주소를 볼 수있는
기본 DNS 서버 주소가 컴퓨터에 등록 확인 nslookup 명령을
 
10.
 (1)에 전달하여 도메인 이름 문자열 포맷의 IP 어드레스를 획득하기 위해 다음 함수
#INCLUDE <netdb.h>에
 구조체 하는 hostent * gethostbyname까지도 ( CONST의  CHAR * 호스트);

 HOSTNET 구조 포인터를 반환 성공, NULL 포인터를 반환하는 실패

 
구조체 HOSTNET 
{ 
  CHAR * 을 h_name;
  문자 ** h_aliases;
  INT h_addrtype;
  INT h_lenght;
  문자 ** h_addr_list; 
}

 (2)이 gethostbyaddr ()는 IP 어드레스 취득 도메인과 관련된 정보를 이용하여 함수

#INCLUDE <netdb.h>에
 구조체 HOSTNET *이 gethostbyaddr ( CONST의  CHAR * ADDR, socklen_t이 LEN, INT fanily);

 돌아 가기 HOSTNET의 신체 구조 변수 주소 값 성공, 실패는 NULL 포인터를 반환

 주소 : in_addr를 구조체 포인터 IP 주소 정보가 포함
 렌 : 첫번째 인수에 송신 어드레스 정보의 바이트 수, IPv4를 언제 4의 IPv6 6.
 가족 : 그룹 전송 어드레스 정보, IPv4의 경우 AF_INET, IPv6의 경우 AF_INET6이다
 (3) 바이트 순서 변환 기능
부호 짧은 htons (서명 단편 ); 
 부호 짧은 ntohs (서명 단편 ); 
 부호 길이 htonl (부호 길이 ); 
 부호 길이 ntohl (부호 길이 );

 (4)  네트워크 바이트 순서 정수 문자열 정보 변환

#INCLUDE <ARPA / inet.h> 
 in_addr_t inet_addr은 ( CONST의  CHAR * 문자열 );

  반환 성공에 32 비트 빅 엔디안 정수 값을, 실패 INADDR_NONE

 (5) INET_ATON ()을 사용하고있는 높은 주파수로의 IP 어드레스의 비트 열 (32)과 다시 표시 네트워크 바이트 순서 정수이지만 구조 in_addr를 함수를 이용하여 변환한다
 
#INCLUDE <ARPA / inet.h>
 INT INET_ATON ( CONST의  CHAR * 문자열 , 구조체 * in_addr를 ADDR);

  실패 1 (참) 성공하는 경우, 반환 0 (거짓)을 반환

 (6) inet_ntoa () 함수는, 문자열, 네트워크 바이트 순서 IP 주소를 정수로 변환 할 수있다
#INCLUDE <아르파 / inet.h>
  문자 * inet_ntoa ( 구조체 in_addr를 ADR);

  문자열 값의 주소, -1 실패의 성공적인 전환을 반환;

        통화 inet_ntoa 함수가 다시 이전을 덮어 쓸 수 있습니다 저장된 정보의 문자열이있는 경우, 때문에 복사, 즉시 다른 메모리 공간에 완료 문자열 정보 후에 함수를 호출해야합니다
 
 (7)의 초기화 방법의 네트워크 주소 정보 :
 
구조체 를 sockaddr_in 요지;
 * serv_ip = " 211.217.168.13 " ;
문자 * serv_port " 9190 " ; 
memset 함수 ( 및 ADDR, 0 , 는 sizeof (ADDR)); 
addr.sin_family = AF_INET; 
addr.sin_addr.s_addr = inet_addr은 (serv_ip); 
addr.sin_port = htons (atoi 함수 (serv_port));

 IP 주소를 사용 INADDR_ANY 일정 분배 서버 컴퓨터는 서버의 IP 주소를 자동으로 실행 얻을 수있다

 addr.sin_addr.s_addr = htonl (INADDR_ANY);
(11) 소켓 옵션
getsockopt 함수 ( INT의 양말, INT 레벨 의 INT 의 optname, 공극 *의 optval이, * socklen_t이 때문에 optlen); 
setsockopt를 ( INT의 양말, INT 레벨 INT 의 optname, CONST  공극 *의 optval이, socklen_t이 때문에 optlen)
  • SO_SNDBUF : 사용 가능한 옵션에 대한 버퍼 크기를 입력
  •  SO_RCVBUF : 출력 버퍼 크기 관련 옵션
  •  SO_REUSEADDR :이 옵션은 새로운 소켓 상태에서 TIME_WAIT 소켓 포트 번호를 재 할당 TRUE 설정할 수 있습니다
 TCP_NODELAY는 Nagle 알고리즘을 사용하지 않도록 1로 설정
 
12. 다중 처리
  (1)는 포크 함수를 호출하여 프로세스를 만들
사용법 #include <unistd.h> 
 된 pid_t 포크 ( 공극 );

 부모 프로세스 : 포크 함수는 자식 프로세스의 ID를 반환

 자식 프로세스 : 포크 함수가 반환 0
(2) 방지, 자식 프로세스에 반환 값에 자식 프로세스 종료 매개 변수 값 또는 return 문을 만들 수있는 부모 프로세스를 통과해야 좀비
 파괴 좀비 1 : 대기 기능을 사용하여
사용법 #include <unistd.h> 
된 pid_t 대기 ( INT의 * statloc);

 -> 자식 프로세스 ID의 반환 성공적으로 종료, 실패 반환 -1

 메모리 공간을 절약하기 위해 자식 다이가 statloc 언급 할 때 반환 값은 통과는 다음 매크로에 의해 분리되어야한다
  •  반환은 "진정한"사실 정상적인 자식 프로세스 종료 WIFEXITED
  •  자식 프로세스의 반환 값을 반환 WEXITSTATUS
 좀비 2 파괴 : 사용이 기능을는 waitpid
#INCLUDE <SYS / wait.h> 
 된 pid_t는 waitpid (된 pid_t의 PID, INT * statloc, INT 옵션);

 -> 자식 프로세스 ID의 반환 성공적으로 종료, 실패 반환 -1

 , ID 대기 PID 대상 자식 프로세스가 종료 통과 -1 인 경우, 임의의 자식 프로세스가 종료 기다릴 수도

 (3) statloc 매개 변수 statloc 및 대기 기능은 동일한 의미를 갖는다
 (4) 옵션 자식 프로세스 종료가 그룹 상태 대회를 입력하지 않더라도 선언 wait.h 일정 WNOHANG의에서 sys / 제공하지만, 함수는 0을 반환하고 종료
 (5) 신호와 신호 함수
사용법 #include <signal.h>를 소스 안에서 포함하면
  보이드 (* 신호 ( INT 신호 공극 (FUNC *) ( 공극 ))) ( INT );

 - "신호를 생성하기 위해 호출 함수 리턴 포인터 전에 등록시

 (6), 신호 처리 기능은 sigaction을 사용
사용법 #include <signal.h>를 소스 안에서 포함하면
  INT sugacyion ( INT SIGNO, CONST  구조체 은 sigaction * 법 구조체 은 sigaction * 만일 oldact);

 -> 성공시 0을 반환 실패시 -1

 복수의 소켓을, 포크 함수를 통해 소켓 파일 디스크립터를 복사 동일한 포트에 대응 한 후에 만 소켓 디스크립터는 소켓 파괴하기 위해 종료된다
 
(13) 프로세스 간 통신
 기능이 파이프 라인을 작성을 :
사용법 #include <unistd.h>
  INT 관 ( INT의 filedes로 [ 2 ]);

 -> 성공시 0을 반환 실패시 -1

 filedes로 [0]는 파이프 라인 파일 디스크립터를 통해, 즉 배출관 데이터를 수신하는 데 사용되는
 filedse을 [1]는 파이프 라인 파일 디스크립터를 통해 전송 데이터를 저장하는 데 사용된다, 즉 흡입 파이프
 
만들었죠 14 / O 멀티플렉싱
 (1)에 대한 FD_SET 매크로 변수의 말 :
FD_ZERO (FD_SET * fdset) 
 FD_SET ( INT FD, FD_SET * fdset) 
 FD_CLR ( INT FD, FD_SET * fdset) 
 FD_ISSET (FINT FD, d_set * fdset)

(2) 기능을 선택

#INCLUDE <SYS / 선택 .H> 
 #INCLUDE <SYS / time.h>
  INT  선택 ( INT의 maxfd, FD_SET * readset, FD_SET writeset *, * FD_SET exceptset, CONST  구조체 에 timeval * 초과);

 

15. I의 복수의 I / O 기능

 (1) MSG_OOB 긴급한 메시지를 수신하면, 시스템은 SIGURG 메시지를 말하고 등록 신호 처리기 호출 생성
 SIGURG 신호 처리 및 geipid 함수는 프로세스 ID이 함수 복귀를 호출 할 때 지정해야 (2)의 신호 처리 과정을
 (3) 제어 파일 디스크립터은 fcntl 함수
 
은 fcntl (recv_sock, F_SETOWN, GETPID ());

 상기 호출 "소켓 소유자 (F_SETOWN)의 의미는 프로세스의 ID 등의 파일 디스크립터 recv_sock GETPID 함수 반환 값을 가리 키도록 변경 될

 긴급 메시지는 메시지 처리를 감독하는 것을 의미한다 (+1 오프셋) 다음 위치로 (4) 긴급 비상 메시지 포인터 한정되지 긴급 메시지 전송 형태
 (5) RECV 통화 전송 기능 옵션 동안 MSG_PEEK 읽기가 차단 된 상태, 설정 MSG_PEEK 옵션과 콜 RECV 기능을 입력하지 않습니다 할 데이터가없는 경우에도 다음을 보장하는 것입니다, 읽기 데이터 입력 버퍼가 삭제되지 않습니다 경우에도이 옵션에 대한 MSG_DONTWAIT와 협력하여 자주 함수 호출 방식이 존재 또는 데이터의 유무를 확인 비 블로킹 판독 될

추천

출처www.cnblogs.com/chenweilin/p/11816095.html