基于select函数实现的tcp简单服务器

源码地址 https://github.com/duchenlong/linux-text/tree/master/network/IO/SelectTcp

在这里插入图片描述

回忆TCP的连接过程

  • 服务端

在这里插入图片描述

  • 客户端

在这里插入图片描述

select

关于select 的介绍,可以参考上一篇博客 https://blog.csdn.net/duchenlong/article/details/106758718

我们使用select函数的地方,是我们服务端所在的地方。

利用select可以监控可读事件的特性,将客户端所发起的连接产生的新的套接字(也就是一个文件描述符),添加到可读事件的集合中。
在这里插入图片描述
由于select中涉及到的处理有点多,我们可以对这些功能进行封装,构造一个selectSvr的类

select 的封装

在这里插入图片描述

tcp类的封装

在这里插入图片描述

程序流程

在这里插入图片描述

程序

cli.cpp 客户端建立连接

#include "Tcpsvr.hpp"
#include <cstdlib>
int main(int argc,char* argv[])
{
   
   
    if(argc != 3)
    {
   
   
        cout<<"请输入正确的参数 [./client] [ip] [port]"<<endl;
        return 0;
    }

    string ip = argv[1];
    uint16_t port = atoi(argv[2]);

    Tcpsvr tcp;
    if(!tcp.CreateSocket())
    {
   
   
        return 0;
    }

    if(!tcp.Connect(ip,port))
    {
   
   
        return 0;
    }

    while(1)
    {
   
   
        cout<<"请输入想给服务端说的话 : ";
        fflush(stdout);
        string buf;
        cin>>buf;
        tcp.Send(buf);
        buf.clear(); 
        //等待接收数据
        
        if(!tcp.Recv(buf))
        {
   
   
            cout<<"我方程序退出"<<endl;
            break;
        }
        cout<<"服务端说 : "<<buf<<endl;
    }
    tcp.Close();

    return 0;
}

SelectSvr.hpp 服务器的头文件

#pragma once 

#include <unistd.h>
#include <sys/select.h>
#include <sys/types.h>
#include <vector>
#include <cstdio>

#include "Tcpsvr.hpp"

using namespace std;

class SelectSvr
{
   
   
    public:
        SelectSvr()
        {
   
   
            _maxFd = -1;
            FD_ZERO(&_readfds);
        }

        //添加文件描述符
        void AddFd(int fd)
        {
   
   
            FD_SET(fd,&_readfds)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值