select 实现 tcp demo
源码地址https://github.com/duchenlong/linux-text/tree/master/network/IO/SelectTcp

回忆TCP的连接过程
- 服务端

- 客户端

select
关于select 的介绍,可以参考上一篇博客 https://blog.youkuaiyun.com/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)

最低0.47元/天 解锁文章
866

被折叠的 条评论
为什么被折叠?



