首页 > 其他分享 >网络io与select

网络io与select

时间:2022-10-08 21:11:43浏览次数:48  
标签:绑定 网络 参数 io 接字 include 我们 select 客户端

我们知道网络IO模型一共有5种,这里我们主要讨论同步IO和select多路复用的情况。
我们先从一个简单的TCP服务器的代码出发,来讨论一下这个是怎么实现的。

一个十分简单的TCP服务器

一个简单的TCP的服务器的建立流程是这样

  • 建立SOCKET
  • 绑定端口
  • 监听
  • 接受连接
  • 接受消息
  • 发送消息
  • 关闭连接
#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<fcntl.h>
#include <unistd.h>



#define BUFFER_LENGTH 128


int main()
{
    //socket有两个参数,第一个参数指定我们要使用IPV4,还是IPV6,第二个参数表明我们要使用套接字类型,这里我们使用的是流格式的套接字,第三个参数就是我们需要使用传输协议
    //这里使用0,表示让系统自动推导我们需要使用的传输协议。
    int listenfd= socket(AF_INET,SOCK_STREAM,0);
    //如果返回值为-1,说明我们创建SOCKET失败,直接返回。
    if (listenfd==-1)
    {
        return -1;
    }
    //我们需要绑定的信息
    struct sockaddr_in serveraddr;
    //使用IPV4
    serveraddr.sin_family=AF_INET;
    //我们需要绑定的IP地址,INADDR_ANY 就是0.0.0.0 ,就是所有网卡的所有IP段都可以连接到我们的创建的TCP服务器上。
    serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
    //我们需要绑定的端口,这里我们绑定的端口为9999
    serveraddr.sin_port=htons(9999);
    //第一个参数我们创建的套接字,第二个是我们填写的绑定信息,最后是我们的绑定信息结构体的大小。    
    if (-1==bind(listenfd,(const  sockaddr*)&serveraddr,sizeof(serveraddr)))
    {
        return -2;        
    }
    //监听我们创建的套接字,请求的队列数量,这里我们填写为10个
    listen(listenfd,10);
    //定义客户端的socket
    struct sockaddr_in client;
    //客户端结构体的长度
    socklen_t len=sizeof(client);
    //等待接受连接
    //第一个参数服务器的套接字,第二个接收到的客户端的socket,第三个函数就是结构体的长度
    int clientfd=accept(listenfd,(struct sockaddr*)&client,&len);
    //接受的缓冲区大小
    unsigned char buffer[BUFFER_LENGTH]={0};
    //收函数
    //第一个参数客户端的套接字,第二个参数,接受的缓冲区,第三个参数缓冲区的大小,第4个参数接收到的字节数
    int ret = recv(clientfd,buffer,BUFFER_LENGTH,0);
    if (ret==0)
    {
       close(clientfd);

    }
    printf("buffer: %s , ret : %d\n",buffer,ret);
    //发函数
    //第一个参数客户端的套接字,第二个参数,发送的缓冲区,第三个参数发送的字节数,第4个参数实际发送的字节数
    ret = send(clientfd,buffer,ret,0);


}

上面的代码已经把每个函数的参数的作用,还有 参数的意义都已经注释上了,
运行一下上面的代码,并使用我们的网络调试助手,发现我们的客户端已经可以收发数据了。
现在就遇到了一个问题,如果我们想一直接受和发送数据,我们需要做什么处理那?
可能大多数人都可以想到,我们添加 一个while循环的就可以一直接受数据了,因此我们改变一下我们的代码。
让它可以一直收发数据,知道我们的客户端退出为止。

标签:绑定,网络,参数,io,接字,include,我们,select,客户端
From: https://www.cnblogs.com/wenlong-4613615/p/16756043.html

相关文章