1. 클라이언트는 순서를 호출
다음과 같이 클라이언트 프로그래밍 순서는 다음과 같습니다
-
소켓을 작성하는 소켓 함수를 호출
-
연결 서버 연결을 전화
-
는 I / O 기능 (쓰기 / 읽기) 및 서버 측 통신 전화
-
가까운 소켓을 호출하는 폐쇄
2. 서버 측 호출 시퀀스
다음과 같이 서버 프로그래밍 순서는 다음과 같습니다
-
소켓을 작성하는 소켓 함수를 호출
-
통화 바인드 바인드 로컬 주소와 포트
-
시작 통화 듣기를 듣고
-
호출이 연결된 큐에서 추출 된 클라이언트 연결을 수락
-
는 I / O 기능 (읽기 / 쓰기) 클라이언트와 통신하는 전화
-
닫기 기능은 소켓을 닫 전화
3. 공통 기능
3.1. 소켓과 어드레스 결합 기능
(1) 결합 어드레스
사용법 #include <SYS / socket.h>
INT 바인드 (INT sockfd와, CONST 구조체 SOCKADDR * ADDR, socklen_t이 LEN);
반환 값 : 성공 반환 0, -1 오류
특별 바인드 주소 소개
당신은 특별한을 사용하는 데 필요한 모든 인터페이스에 연결 요청에 응답하도록하려면 우리는 단지 주소에 대한 연결 요청에 대해 신경 경우 호스트가 여러 네트워크 인터페이스와 여러 개의 IP 주소를 가질 수 있습니다, 우리는 특정 지역의 IP 주소를 지정할 수 있습니다 주소 INADDR_ANY
#DEFINE INADDR_ANY (uint32_t)을 0x00000000
얻은 모든 IP의 서버에 연결 요청을 들어
servaddr를 sockaddr_in 구조체;
memset 함수 (servaddr, 0는 sizeof (servaddr));
servaddr.sin_addr.s_addr = INADDR_ANY;
3.2. 소켓에 바인드 주소 찾기
사용법 #include <SYS / socket.h>
INT는 getsockname (INT sockfd와, 구조체 SOCKADDR restrict_addr *, *의 socklen_t restrict_alenp);
반환 값 : 성공 반환 0, -1 오류
3.3. 다른 주소 가져 오기
getpeername는 INT (INT sockfd와, 구조체 SOCKADDR restrict_addr *, *의 socklen_t restrict_alenp);
반환 값 : 성공 반환 0, -1 오류
3.4. 서버 측에 연결을 설정하려면
사용법 #include <SYS / socket.h>
int listen(int sockfd, int backlog);
返回:成功返回0,出错返回-1。
backlog指定进行客户端连接排队的队列长度。
int accept(int sockfd, struct sockaddr *restrict_addr, socklen_t *restrict_len);
返回:成功返回一个新的sockfd(客户端的)。
3.5.客户端请求连接
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t len);
返回:成功返回0,出错返回-1
3.6.IO操作函数
read和write函数默认都是阻塞性的读写函数。此时需要考虑服务器的并发处理。
4.服务器端并发性处理
4.1.多进程模型
弊端:进程占用系统资源,当子进程过多将占用过多的系统资源,难以处理大并发的场景。
4.2.多线程模型
以分离状态去启动子线程,子线程运行完后自动释放空间。