OwenJi 2019-12-02
客户端编程序列如下:
服务端的编程序列如下:
(1)绑定地址
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);
返回:成功返回0,出错返回-1
特殊bind地址介绍
一个主机可以有多个网络接口和多个IP地址,如果我们只关心某个地址的连接请求,我们可以指定一个具体的本地IP地址,如果要响应所有接口上的连接请求就要使用一个特殊的地址INADDR_ANY
#define INADDR_ANY (uint32_t)0x00000000
监听所有服务器上IP得到的连接请求
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_addr.s_addr = INADDR_ANY;
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *restrict_addr, socklen_t *restrict_alenp);
返回:成功返回0,出错返回-1
int getpeername(int sockfd, struct sockaddr *restrict_addr, socklen_t *restrict_alenp);
返回:成功返回0,出错返回-1
#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(客户端的)。
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t len);
返回:成功返回0,出错返回-1
read和write函数默认都是阻塞性的读写函数。此时需要考虑服务器的并发处理。
弊端:进程占用系统资源,当子进程过多将占用过多的系统资源,难以处理大并发的场景。
以分离状态去启动子线程,子线程运行完后自动释放空间。