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  阅读(82)  评论(0编辑  收藏  举报

导航