1.Windows 리눅스에서 프로그램을 소켓과 같은 생각하지만 세부 다소 다른
Windows에서 (1) 소켓 프로그램의 Winsock.dll 또는 WS2_32.DLL가 사전에로드해야합니다 의존하고있다. 를 참조하시기 바랍니다 DLL을로드하는 방법은 두 가지가 있습니다 : DLL 동적 링크 라이브러리의로드는
Windows가 "파일 핸들"개념을 사용하는 반면 (2) 리눅스는 "파일 설명"의 개념을 사용하며, 리눅스가 일반 파일과 소켓 파일 및 Windows 구분하지 않습니다 구별;
. (3) 리눅스 소켓에서 () 함수는 int 형의 값을 반환하고, 윈도우 즉 핸들 소켓 타입입니다.
송신 및 기능 (4) 리눅스에서 Windows 용 () / 전송 () RECV를 사용하여 읽기 및 쓰기 위해 () / 쓰기 () 함수를 읽어받을 수 있습니다.
(5) 폐쇄 소켓, 윈도우가 closesocket 함수 () 함수를 사용하는 반면, 닫기 () 함수를 사용하여 Linux.
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에 () 함수를 호출하고 사용할 표시
최신 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)의 연결을 설정하기 위해 연결 () 함수를 사용하여
특정의 IP 주소와 포트, 순서대로 IP 주소 및 포트를 통해 데이터 유일한 방법 흐름와 결합되는 결합 () 함수는 소켓을 이용하여 (2) 처리 소켓
(3)의 연결을 설정하기 위해 연결 () 함수를 사용하여
(4) SOCKADDR 구조가
고려 될 수 있으며, SOCKADDR 범용 구조, IP 주소와 포트 번호의 다양한 유형을 저장하는데 사용될 수 있고, 구조의 IPv4 주소를 sockaddr_in 저장하도록 설계
와 가산에서 sockaddr_in6에 IPv6 주소를 저장
고려 될 수 있으며, SOCKADDR 범용 구조, IP 주소와 포트 번호의 다양한 유형을 저장하는데 사용될 수 있고, 구조의 IPv4 주소를 sockaddr_in 저장하도록 설계
와 가산에서 sockaddr_in6에 IPv6 주소를 저장
(5) 사용이 기능은 수동 청취 상태로 소켓을 할 수 있습니다 () 듣기
(6) 기능은 클라이언트 요청에 응답 할 준비가 될 수있다 () 동의
(. 7) 클라이언트와 통신 할 수있는 새로운 소켓을 반환) (동의, ADDR 저장 클라이언트의 IP 주소와 포트 번호
(8) (듣기) 만 코드가 동의 () 할 때까지 계속 실행됩니다 뒤에) (듣기 상태로 소켓, 정말, 클라이언트 요청을 수신 수신하지 않습니다 수 있도록
(9) 동의 () (코드를 실행할 수 없습니다 후) 실행을 차단합니다, 때까지 새로운 요청이 들어온다.
(10) TCP 서버 함수 호출 순서 : 소켓 () -> 바인드 () - () 적용> - -> (가)) (듣기 -> 읽기 () / 쓰기 ()> 닫기 ()
(. 11)를 TCP 클라이언트 함수 호출 순서 : 소켓 () -> (연결 ) ->) (읽기 / 쓰기 () -> 닫기 ()
(. 7) 클라이언트와 통신 할 수있는 새로운 소켓을 반환) (동의, ADDR 저장 클라이언트의 IP 주소와 포트 번호
(8) (듣기) 만 코드가 동의 () 할 때까지 계속 실행됩니다 뒤에) (듣기 상태로 소켓, 정말, 클라이언트 요청을 수신 수신하지 않습니다 수 있도록
(9) 동의 () (코드를 실행할 수 없습니다 후) 실행을 차단합니다, 때까지 새로운 요청이 들어온다.
(10) TCP 서버 함수 호출 순서 : 소켓 () -> 바인드 () - () 적용> - -> (가)) (듣기 -> 읽기 () / 쓰기 ()> 닫기 ()
(. 11)를 TCP 클라이언트 함수 호출 순서 : 소켓 () -> (연결 ) ->) (읽기 / 쓰기 () -> 닫기 ()
제 5.Ack = 서열 번호 + 송신 된 바이트의 수 + 1
6.
(1)은 () / closesocket 함수 () 함수의 수단이 완전 분리 가까운, 즉, 송신 할 데이터가 없으며 호출 수신 데이터
(2), 다른 유지하면서, 기능은 하나의 데이터 전송 채널을 해제 할 수있다 () 종료를 사용
가까운 경우에 (3) () / closesocket 함수 ()는 즉시 출력 버퍼에 관계없이 기본적으로 네트워크에 FIN 패킷을 전송 (데이터가 존재하지만, 데이터 전송 출력 버퍼 종료 ()는 손실 된 데이터를 출력 버퍼 것이다 /) (closesocket 함수 ()를 닫기를 호출 FIN 패킷 재전송 방법의 완료를 기다릴 및 통화 종료 할 )는하지 않습니다.
(2), 다른 유지하면서, 기능은 하나의 데이터 전송 채널을 해제 할 수있다 () 종료를 사용
INT 종료 ( INT의 양말, INT 하우투); // 리눅스 INT의 종료 (SOCKET의, INT의 하우투); // 윈도우
분리 소켓의 필요성에 대한 양말, 하우투는 방법 꺼져
하우투 리눅스에서 값을 다음과 같은 :- SHUT_RD는 상기 입력 스트림을 분리. 소켓 (수신 된 데이터를 상기 입력 버퍼는 소거 된 경우에도) 데이터를 수신 할 수 있고, 관련 함수 호출을 입력 할 수 없다.
- SHUT_WR : 출력 스트림을 분리합니다. 소켓은 데이터를 전송할 수 있지만,이 전송되지 않고, 그 대상 호스트로 전달되는 경우, 데이터 출력 버퍼.
- SHUT_RDWR : OFF I 동안 / O 스트림. ) (2 회 종료에 대응하는 전화, 상기 SHUT_RD 다른 파라미터에 파라미터 SHUT_WR.
- SD_RECEIVE : 즉, 분리 된 입력 스트림 근접 수신 동작.
- SD_SEND : 즉, 분리 된 출력 스트림 근접 송신 동작.
- SD_BOTH : 동시 닫기 수신 및 전송 작업.
가까운 경우에 (3) () / closesocket 함수 ()는 즉시 출력 버퍼에 관계없이 기본적으로 네트워크에 FIN 패킷을 전송 (데이터가 존재하지만, 데이터 전송 출력 버퍼 종료 ()는 손실 된 데이터를 출력 버퍼 것이다 /) (closesocket 함수 ()를 닫기를 호출 FIN 패킷 재전송 방법의 완료를 기다릴 및 통화 종료 할 )는하지 않습니다.
7. RECV ()가 독특한 기회를 반환하면 0 FIN 패킷을 수신
8. 네트워크 바이트 순서
CPU (리틀 엔디안의 인텔 제품군의 주요 CPU)를 저장하는 다양한 방법과 구문 분석 된 데이터는 구문 분석 오류 데이터는 경우 작은 엔디안과 빅 엔디안 시스템 통신 시스템을 발생합니다. 네트워크 바이트 순서 (네트워크 바이트 순서) - 따라서, 데이터를 송신하기 전에, 단일화로 데이터를 포맷한다. 통합 네트워크 바이트 순서는 빅 엔디안이다.
CPU (리틀 엔디안의 인텔 제품군의 주요 CPU)를 저장하는 다양한 방법과 구문 분석 된 데이터는 구문 분석 오류 데이터는 경우 작은 엔디안과 빅 엔디안 시스템 통신 시스템을 발생합니다. 네트워크 바이트 순서 (네트워크 바이트 순서) - 따라서, 데이터를 송신하기 전에, 단일화로 데이터를 포맷한다. 통합 네트워크 바이트 순서는 빅 엔디안이다.
9.
핑 도메인은 도메인 이름에 해당하는 IP 주소를 볼 수있는
기본 DNS 서버 주소가 컴퓨터에 등록 확인 nslookup 명령을
핑 도메인은 도메인 이름에 해당하는 IP 주소를 볼 수있는
기본 DNS 서버 주소가 컴퓨터에 등록 확인 nslookup 명령을
10.
(1)에 전달하여 도메인 이름 문자열 포맷의 IP 어드레스를 획득하기 위해 다음 함수
렌 : 첫번째 인수에 송신 어드레스 정보의 바이트 수, IPv4를 언제 4의 IPv6 6.
가족 : 그룹 전송 어드레스 정보, IPv4의 경우 AF_INET, IPv6의 경우 AF_INET6이다
(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 설정할 수 있습니다
12. 다중 처리
(1)는 포크 함수를 호출하여 프로세스를 만들
사용법 #include <unistd.h> 된 pid_t 포크 ( 공극 );
부모 프로세스 : 포크 함수는 자식 프로세스의 ID를 반환
자식 프로세스 : 포크 함수가 반환 0
(2) 방지, 자식 프로세스에 반환 값에 자식 프로세스 종료 매개 변수 값 또는 return 문을 만들 수있는 부모 프로세스를 통과해야 좀비
파괴 좀비 1 : 대기 기능을 사용하여
파괴 좀비 1 : 대기 기능을 사용하여
사용법 #include <unistd.h> 된 pid_t 대기 ( INT의 * statloc);
-> 자식 프로세스 ID의 반환 성공적으로 종료, 실패 반환 -1
메모리 공간을 절약하기 위해 자식 다이가 statloc 언급 할 때 반환 값은 통과는 다음 매크로에 의해 분리되어야한다- 반환은 "진정한"사실 정상적인 자식 프로세스 종료 WIFEXITED
- 자식 프로세스의 반환 값을 반환 WEXITSTATUS
#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 함수
(5) RECV 통화 전송 기능 옵션 동안 MSG_PEEK 읽기가 차단 된 상태, 설정 MSG_PEEK 옵션과 콜 RECV 기능을 입력하지 않습니다 할 데이터가없는 경우에도 다음을 보장하는 것입니다, 읽기 데이터 입력 버퍼가 삭제되지 않습니다 경우에도이 옵션에 대한 MSG_DONTWAIT와 협력하여 자주 함수 호출 방식이 존재 또는 데이터의 유무를 확인 비 블로킹 판독 될
은 fcntl (recv_sock, F_SETOWN, GETPID ());
상기 호출 "소켓 소유자 (F_SETOWN)의 의미는 프로세스의 ID 등의 파일 디스크립터 recv_sock GETPID 함수 반환 값을 가리 키도록 변경 될
긴급 메시지는 메시지 처리를 감독하는 것을 의미한다 (+1 오프셋) 다음 위치로 (4) 긴급 비상 메시지 포인터 한정되지 긴급 메시지 전송 형태(5) RECV 통화 전송 기능 옵션 동안 MSG_PEEK 읽기가 차단 된 상태, 설정 MSG_PEEK 옵션과 콜 RECV 기능을 입력하지 않습니다 할 데이터가없는 경우에도 다음을 보장하는 것입니다, 읽기 데이터 입력 버퍼가 삭제되지 않습니다 경우에도이 옵션에 대한 MSG_DONTWAIT와 협력하여 자주 함수 호출 방식이 존재 또는 데이터의 유무를 확인 비 블로킹 판독 될