이 문서는 소켓과 바이트 순서의 개념뿐만 아니라 몇 가지 일반적인 구조와 기능을 포함 리눅스 소켓 프로그래밍의 기초를 설명합니다.
이 문서는 NetEase는 클라우드 교실 학습 과정에 기록됩니다, 교사가 꽤 좋은, 나는 구경꾼을 추천합니다.
리눅스 네트워크 프로그래밍 리눅스 네트워크 프로그래밍 | 것들 인공 지능
1. 개념
1.1 소켓 (소켓)
소켓 (소켓)는 애플리케이션 프로세스는 네트워크 통신을위한 TCP / UDP 네트워크 프로토콜과 같은 수단을 제공 준다 정의 한 세트의 인터페이스 및 데이터 구조를 포함하는 전화 통신 메커니즘이다.
소켓 인터페이스를 통해 리눅스 네트워크 프로그래밍, 해당 파일 기술자를 제공하기 위해, 모두에게 특별한 IO를 소켓. 완전 배의 소켓 (프로토콜, 로컬 주소, 로컬 포트, 원격 주소, 원격 포트), 각 소켓은 운영 시스템에 의해 할당 된 고유 한 로컬 소켓을 보유 함 연관된 설명을 갖는다.
1.2 엔디안
빅 엔디안 바이트 순서와 리틀 - 엔디안으로 네트워크 프로토콜 즉, 빅 endian 바이트 순서를 사용하여 네트워크.
바이트 내부 네트워크 바이트 순서 및 데이터 변환에 다른 시스템의 시퀀스.
2 엔디안 변환 기능이 사용
uint32_t htonl (uint32_t hostlong); |
32 비트 정수 네트워크 바이트 순서 바이트 순서로 호스트에 의해 변환 될 |
uint16_t의 htons (uint16_t의 hostshort); |
16 비트 정수가 네트워크 바이트 순서 바이트 순서로 호스트에 의해 변환 될 |
uint32_t ntohl (netlong를 uint32_t); |
호스트 바이트 순서로 전환하여 네트워크 바이트 순서의 32 비트 정수 |
uint16_t의 ntohs (uint16_t의 netshort); |
16 비트 정수가 네트워크 바이트 순서 바이트 순서로 호스트에 의해 변환 될 |
3 데이터 구조
3.1 일반 주소 구조 (일반적으로 사용하지 않는,하지만 커널을 사용하는, 이러한 데이터 구조를 캐스팅하는 것이 필요하다)
사용법 #include <SYS / socket.h>
구조체 SOCKADDR {
서명되지 않은 짧은 인 sa_family;
숯 sa_data [14];
};
sa_data : 그것은 데이터와 함께 혼합 인 내부 어드레스의 개수, 원격 컴퓨터와 소켓의 포트 번호를 포함한다.
인 sa_family : 일반적인 사용의 IPv4 AF_INET.
함수는 어드레스 구성에 전달되면 * 전달 구조 SOCKADDR 구조체 포인터로 변환해야.
3.2 인터넷 주소 구조
{in_addr를 구조체
in_addr_t의 s_addr // IPv4 주소
};
구조체 scokaddr_in {
sin_family 짧은 INT (호스트 바이트 순서)로 // 인터넷 주소 패밀리 AF_INET
서명되지 않은 짧은 INT의 sin_port; // 포트 번호, 16 비트 (네트워크 바이트 순서)
구조체 in_addr를 sin_addr; // 인터넷 주소, 32 비트 IPv4 주소 (네트워크 바이트 순서)
부호 숯 sin_zero [8] // (이들 포맷 패딩 비트) 0을 추가
};
일반적인 구조에 해당하는 구조 데이터 유형의 주소와 인터넷 주소는, 서로 사용하는 것이 일반적으로 더 편리를 sockaddr_in을 변환 할 수 있습니다.
4. 기본 기능
4.1 만들기 소켓
사용법 #include <SYS / socket.h>
INT 소켓 (INT 도메인, INT 유형, INT protocal)
반환 값 : 성공 반환 파일 기술자, 오류 리턴 -1.
성공적인 복귀 커널 소켓 기술자 파일 설명 테이블을 만든 경우, 커널에 소켓을 작성합니다.
매개 변수 :
도메인 : AF_INET IPv4의 인터넷 도메인 , AF_INET6 IPv6 인터넷 도메인, AF_UNIX 유닉스 도메인, AF_UNSPEC 지정되지 않았습니다.
프로토콜 : 일반적으로 0, 주어진 필드로 표현되는 기본 프로토콜과 소켓 타입을 선택합니다
입력 SOCK_STREAM의 스트림 소켓을 안정적 연결형 트래픽을 제공하는 것은 TCP 프로토콜, TCP 시퀀스를 사용하고, 데이터 전송의 정확성을 보장하는 흐른다.
SOCK_DGRAM의 데이터 그램 소켓은 비 연결 서비스, 데이터, 독립적으로 패킷을 전송 무질서하고, 데이터 그램 프로토콜 UDP 프로토콜을 사용하여, 신뢰성, 오류가없는 것은 아닙니다 정의합니다. 같은 IP ICMP와 같은 SOCK_RAW 원시 소켓, 낮은 수준의 프로토콜 또는 주로 새로운 네트워크 프로토콜을 테스트하기 위해 직접 액세스를 허용하고있다. SOCK_SEQPACKET 고정 길이, 질서, 신뢰할 수있는 연결 지향 메시지 전달.
4.2.IPv4 주소 가족과 주소 문자 사이의 전송 기능
#INCLUDE <ARP / inet.h>
기능 : 네트워크 바이트 순서 변환 사이트 진수
CONST * CHAR inet_ntop (INT 도메인 CONST 보이드의 restrict_addr *, * CHAR restrict_str, socklen_t이 크기);
기능 : 소수점이 네트워크 바이트 순서로 변환됩니다
CONST * CHAR inet_pton (INT 도메인 CONST 공극 * STR을 제한 ADDR * CHAR는 제한);
매개 변수 :
도메인 : 인터넷 주소 패밀리 같은 AF_INET로
주소 : 인터넷 주소, 32 비트 IPv4 주소 (네트워크 바이트 순서)
STR : 문자열의 주소 (점으로 구분 된 십진수) 포인터
크기 : 주소 문자열의 크기
4.3 채우기 IPv4 주소 가족 구조의 케이스
죄를 sockaddr_in 구조체; // 구조체를 sockaddr_in을 정의
숯 BUF [16];
memset 함수 (죄 0를 sizeof (SIN));
sin.sin_family = AF_INET, 인터넷 주소 가족 // 채우기
sin.sin_port = htons ((짧은) 3001); // 채우기 포트 번호 (네트워크 바이트 순서)
//填写sin_addr
if (inet_pton(AF_INET, "192.168.2.1", &sin.sin_addr.s_addr) <=0)
{
//错误处理
}
printf("%s\n", inet_ntop(AF_INET, &sin.sin_addr.s_addr, buf, sizeof(buf)));