• Linux--socket编程


    socket套接字编程

    一、服务器和客户端的开发步骤:
    在这里插入图片描述

    1、创建套接字
    2、为套接字添加信息(ip地址和端口号)
    3、监听网络连接
    4、监听到有客户端接入,接受连接(如没有接入,会发生阻塞到)
    5、数据交互(服务器与客户端)
    6、关闭套接字,断开连接

    二、socket函数api
    1、创建套接字:

    int socket(int domain, int type, int protocol);
    
    /*
    domain:
    指明所使用的协议族,通常为AF_INET,表示互联网协议族(tcp/ip协议族);
    AF_INET        IPv4因特网域(192.168.---.---)
    AF_INET6       IPv6因特网域
    AF_UNIX        Unix域
    AF_ROUTE       路由套接字
    AF_KEY         密钥套接字
    AF_UNSPEC      未指定
    
    type参数指定socket的类型:
    	SOCK_STREAM:流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。
    	SOCK_DGRAM(报文):数据报套接字定义了一种无连接的服务器,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠的、无差错的。它使用数据协议UDP。
    	SOCK_RAW:允许程序使用低层协议,原始套接字允许对底层协议如IP或ICMP进行访问,功能强大但较为不便,主要用于一些协议的开发。
    
    protocol:
    通常赋值"0"。
    	0选择type类型对应的默认协议
    	IPPROTO_TCP         TCP传输协议
    	IPPROTO_UDP         UDP传输协议
    	IPPROTO_SCTP        SCTP传输协议
    	IPPROTO_TIPC        TIPC传输协议
    */
         
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2、地址
    添加地址(IP地址+端口号),调用 bind() 函数
    bind() 函数 :IP端口号与相应描述字赋值函数
    功能:用于绑定ip地址和端口号到socketfd
    参数:

    sockfd:时socket的描述符
    addr:是一个指向含有本机ip地址及端口号等信息的sockaddr类型的指针,指向要绑定给sockfd的协议地址结构,这个地址结构根据地址创建socket时的地址协议族的不同而不同。
    addrlen:长度

    #include 
    #include 
     
    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    //描述符,指针,指针长度
      
    //ipv4对应的是;
    struct sockaddr{
        unisgned short as_family;//协议族
        char           sa_data[14];//IP+端口号
    };
    //同等替换
    struct sockaddr_in{
        sa_family_t    sin_family;//协议族
        in_port_t      sin_port;  //端口号
        struct in_addr sin_addr;  //ip地址结构体
        unsigned char  sin_zero[8];//填充,没有实际意义,只是为跟sockaddr结构在内存中对齐,这样才能相互转换
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3、地址转换api

    int inet_aton(const char* straddr, struct in_addr addrp);
    把字符串形式"192.168.1.123"转为网络能识别的格式
    char
    inet_ntoa(struct in_addr inaddr);
    把网络格式的ip地址转为字符串形式

    4、监听
    调用 listen() 函数:监听设置函数
    功能:
    设置能处理的最大连接数, listen()并未开始接受连线,只是设置socket 的 listen 模式,listen()函数只用于服务器端,服务器进程不知道与谁连接,因此不会主动要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并做出处理:一个服务进程可以同时处理多个客户进程的连接。
    主要有2个功能:
    ①将一个未连接的套接字转换为一个被动套接字(监听)
    ②规定内核为相应套接字排队的最大连接数。

    内核为任何一个给定监听套接字维护两个队列:

    ①未完成连接队列,每个这样的SYN报文段对应其中一项:已由某个客户端发出并到达服务器,而服务器正在等待完成相应的TCP三次握手过程。这些套接字处于SYN_REVD状态。
    ②已完成连接队列,每个已完成TCP三次握手过程的客户端对应其中一项。这些套接字处于ESTABLISHED状态。

    参数:

    sockfd:是socket系统调用返回服务器端的socket描述符
    backlog:指定在请求队列中允许的最大请求数

    
    #include 
    #include 
     
    int listen(int sockfd, int backlog);
    //描述符,数量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5、连接
    调用accept() 函数:
    功能:
    accept函数由TCP服务器调用,用于从已完成连接队列头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。
    参数:

    sockfd:是socket系统调用返回的服务器端socket描述符。
    addr:用来返回已连接的对端(客户端)的协议地址
    addrlen:客户端地址长度

    返回值:
    该函数的返回值是一个新的套接字描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字(表示TCP三次握手已完成),当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。

    
    #include 
    #include 
     
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    //描述符,客户端地址,地址长度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    6、数据收发
    在套接字通信中进行字节读取函数:read(),write()。与I/O中的读取函数略有区别,他们输入和输出字节数比可能比请求的少。

    ssize_t write(int fd, const void *buf,size_t nbytes);
    ssize_t read(int fd, void *buf, size_t nbyte);
    //函数均返回读或写的字节个数,出错则返回-1
    
    • 1
    • 2
    • 3

    第一个将buf中的nbyte个字节写入fd中,成功返回写入的字节个数
    第二个从fd中读取nbyte个字节到buf中,返回实际读取的字节数。

    网络I/O还有一些函数,例如:recv() / send(),readv() / writev(),recvmsg() / sendmsg(), recvfrom() / sendto()等

  • 相关阅读:
    java架构师禁止在项目中使用继承,合理吗?
    HS6621Cx 一款低功耗蓝牙SoC芯片 应用于键盘、鼠标和遥控器消费类产品
    项目怎么同时连接mysql和oracle
    公司新招了个字节拿36K的人,让我见识到了什么才是测试扛把子......
    【技术指南资料】编码器与正交译码器
    openssl+ DES开发实例(Linux)
    牛客网语法篇练习基础语法(一)
    前端页面滑动问题求解
    性能测试度量指标
    十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】
  • 原文地址:https://blog.csdn.net/weixin_48208102/article/details/133514265