Socket编程
网络套接字(socket):
一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现)。
在通信过程中,套接字一定是成对出现的。
B/S()与C/S()模型区别
C/S B/S
优点:缓存大量数据、协议选择灵活、速度快 安全性、跨平台、开发工作量较小
缺点:安全性、跨平台、开发工作量大 不能缓存大量数据、严格遵守 http
网络字节序
小端法(PC本地存储):高位存高地址,低位存低地址。
大端法(网络存储):高位存低地址,低位存高地址。
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); 本地字节序----->网络字节序 (用于IP转换)
uint16_t htons(uint16_t hostshort); 本地字节序----->网络字节序 (用于port转换)
uint32_t ntohl(uint32_t neglong); 网络字节序----->本地字节序 (用于IP转换)
uint16_t ntohs(uint16_t netshort); 本地字节序----->网络字节序 (用于port转换)
h标识host,n标识network, l标识32位长整型数,s标识16位短整型数。
IP地址转换函数
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst); 本地字节序(string IP)-----> 网络字节序
参数:af:AF_INET / AF_INET6;src:传入,IP地址(点分十进制);dst:传出,转换后的 网络字节序 IP地址。
返回值:成功(1);异常(0),说明src指向的不是一个有效的ip地址;失败(-1)。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数:af:AF_INET / AF_INET6;src:传入,网络字节序IP地址;dst:传出,本地字节序(string IP);size:传出,dst的大小。
返回值:成功,返回dst;失败,返回NULL。
p标识IPv4/v6,n标识网络
sockaddr数据结构
使用【 man 7 ip 】查看,sockaddr数据结构。
struct sockaddr_in addr;
addr.sin_family = AF_INET / AF_INET6;
addr.sin_port = htonsl(9527);
int dst = 0;
inet_pton(AF_INET, "192.168.1.101", (void*)&dst);
addr.sin_addr.s_addr = &dst
addr.sin_addr.s_addr = htonl(INADDR_ANY); 取出系统中有效的任意IP地址。二进制类型。
socket模型创建流程图
socket函数
#include <sys/socket.h>
int socket(int domain, int type, int protocol); 【创建一个 套接字】
帮助:man 2 socket
参数:domain:AF_INET、AF_INET6、AF_UNIX;type:SOCK_STREAM、SOCK_DGRAM;protocol:0。
返回值:成功:新套接字所对应文件描述符;失败:-1,errno。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 【给socket绑定一个 地址结构(IP+port)】
帮助:man 2 bind
参数:sockfd:socket()函数返回值;addr:(struct sockaddr *)(struct sockaddr_in 类型的地址);addrlen:地址结构的size
返回值:成功:0;失败:-1,errno。
int listen(int sockfd, int backlog); 【设置同与服务器建立连接的上限。(同时进行3次握手的客户端数量)】
帮助:man 2 listen
参数:sockfd:socket()函数返回值;backlog:上限数值,最大128。
返回值:成功:0;失败:-1,errno。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 【阻塞等待客户端建立连接。成功:返回一个与客户端成功连接的socket文件描述符】
帮助:man 2 accept
参数:sockfd:socket()函数返回值;addr:传出参数,成功与服务器建立连接的那个客户端的地址结构;addrlen:传入传出,入:addr的大小,出:客户端addr实际大小。
返回值:成功:能与服务器进行数据通信的socket对应的文件描述符;失败:-1,errno。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 【使用现有的socket与服务器建立连接】
帮助:man 2 connect
参数:socket()函数返回值;addr:传入参数,服务的地址结构;addrlen:服务器地址结构的大小。
返回值:成功:0;失败:-1;errno。
posted on 2020-12-04 15:55 DavidLiuMax 阅读(93) 评论(0) 编辑 收藏 举报