TCP(select函数模型)

2023-05-16

客户端代码

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<sys/select.h>
#include<netinet/in.h>

#define MSG_ERR(msg) do{fprintf(stderr,"_%d_",__LINE__);perror(msg);return -1;}while(0)

#define PORT 8888
#define IP "192.168.31.21"

int main()
{
        int sfd = socket(AF_INET,SOCK_STREAM,0);
        if(sfd < 0)
        {
                MSG_ERR("socket");
        }

        int reuse = 1;
        if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
        {
                MSG_ERR("setsockopt");
        }

        struct sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(PORT);
        sin.sin_addr.s_addr = inet_addr(IP);

        if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
        {
                MSG_ERR("connect");
        }
        printf("connect success\n");

        fd_set readfds,tempfds;

        FD_ZERO(&readfds);
        FD_ZERO(&tempfds);
        FD_SET(0,&readfds);
        FD_SET(sfd,&readfds);

        char buf[128] = "";
        int maxfd = sfd;
        int select_res = 0;
        int i = 0;
        int res = 0;

        while(1)
        {
                tempfds = readfds;
                select_res = select(maxfd+1,&tempfds,NULL,NULL,NULL);
                if(select_res < 0)
                {
                        MSG_ERR("select");
                }
                else if(0 == select_res)
                {
                        fprintf(stderr,"select time out\n");
                        break;
                }
                if(FD_ISSET(0,&tempfds))
                {
                        bzero(buf,sizeof(buf));
                        fgets(buf,sizeof(buf),stdin);
                        buf[strlen(buf)-1] = 0;

                        if(send(sfd,buf,sizeof(buf),0) < 0)
                        {
                                MSG_ERR("send");
                        }
                        printf("send message success\n");
                }
                if(FD_ISSET(sfd,&tempfds))
                {
                        bzero(buf,sizeof(buf));

                        res = recv(sfd,buf,sizeof(buf),0);
                        if(res < 0)
                        {
                                MSG_ERR("recv");
                        }
                        else if(res == 0)
                        {
                                printf("server is off_line\n");
                                break;
                        }
                        printf("%d : %s\n",sfd,buf);
                }
        }
        close(sfd);
        return 0;
}

服务器代码

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<sys/select.h>
#include<netinet/in.h>

#define MSG_ERR(msg) do{fprintf(stderr,"_%d_",__LINE__);perror(msg);return -1;}while(0)

#define PORT 8888
#define IP "192.168.31.21"

int update_maxfd(int maxfd,fd_set readfds);

int main()
{
        int sfd = socket(AF_INET,SOCK_STREAM,0);
        if(sfd < 0)
        {
                MSG_ERR("socket");
        }

        int reuse = 1;
        if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
        {
                MSG_ERR("setsockopt");
        }

        struct sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(PORT);
        sin.sin_addr.s_addr = inet_addr(IP);

        if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
        {
                MSG_ERR("bind");
        }

        printf("bind success\n");
        if(listen(sfd,10) < 0)
        {
                MSG_ERR("listen");
        }
        printf("listen success\n");

        struct sockaddr_in cin;
        socklen_t addrlen = sizeof(cin);

        fd_set readfds,tempfds;
        FD_ZERO(&readfds);
        FD_ZERO(&tempfds);

        FD_SET(0,&readfds);
        FD_SET(sfd,&readfds);

        int maxfd = sfd;
        int select_res = 0;
        char buf[128] = "";
        int newfd = -1;
        int i = 0;
        ssize_t res = 0;
        struct sockaddr_in save_addr[1024-4];
        while(1)
        {
                tempfds = readfds;
                struct timeval tm;
                tm.tv_sec = 5;
                tm.tv_usec = 0;
                select_res = select(maxfd+1,&tempfds,NULL,NULL,&tm);
                if(select_res < 0)
                {
                        MSG_ERR("select");
                }
                else if(0 == select_res)
                {
                        fprintf(stderr,"select time out\n");
                        break;
                }

                for(i=0;i<=maxfd;i++)
                {
                        if(FD_ISSET(i,&tempfds) == 0)
                        {
                                continue;
                        }
                        if(0 == i)
                        {
                                printf("click enter\n");
                                fflush(stdout);

                                bzero(buf,sizeof(buf));
                                int sendfd;
                                int res = scanf("%d %s",&sendfd,buf);
                                while(getchar() != 10);
                                if(res != 2)
                                {
                                        fprintf(stderr,"enter the correct content\n");
                                        continue;
                                }
                                if(FD_ISSET(sendfd,&readfds) == 0)
                                {
                                        fprintf(stderr,"sendfd=%d fd not in the clooection\n",sendfd);
                                        continue;
                                }
                                if(send(sendfd,buf,sizeof(buf),0) < 0)
                                {
                                        MSG_ERR("send");
                                        return -1;
                                }
                                printf("send message success\n");
                        }
                        else if(sfd == i)
                        {
                                printf("click client\n");
                                fflush(stdout);
                                newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
                                if(newfd < 0)
                                {
                                        MSG_ERR("accept");
                                }

                                printf("[%s : %d] newfd = %d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
                                save_addr[newfd-4] = cin;
                                FD_SET(newfd,&readfds);
                                maxfd = maxfd>newfd?maxfd:newfd;
                        }
                        else
                        {
                                bzero(buf,sizeof(buf));
                                res = recv(i,buf,sizeof(buf),0);
                                if(res < 0)
                                {
                                        MSG_ERR("recv");
                                }
                                else if(0 == res)
                                {
                                        printf("[%s : %d] newfd = %d client off-line\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),i);
                                        close(i);
                                        FD_CLR(i,&readfds);
                                        maxfd = update_maxfd(maxfd,readfds);
                                }
                                else
                                {
                                        printf("[%s : %d] newfd = %d : %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),i,buf);
                                }

                        }
                }
        }
}

int update_maxfd(int maxfd,fd_set readfds)
{
        int i = maxfd;
        for( ;i>0;i--)
        {
                if(FD_ISSET(i,&readfds))
                {
                        return i;
                }
        }
        return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP(select函数模型) 的相关文章

  • 找工作笔试面试那些事儿(13)---操作系统常考知识点总结

    上一节对数据库的知识做了一个小总结 xff0c 实际找工作过程中 xff0c 因为公司或单位侧重点不一样 xff0c 考察的知识也是不尽相同的 xff0c 但是作为计算机类的学生 xff0c 操作系统的知识也是必不可少的 xff0c 去年参
  • pnp算法

    pnp算法是解决什么问题的 xff1f PnP xff08 Perspective n Point xff09 是求解 3D 到 2D 点对运动的方法 它描述了当我们知道 n 个 3D 空间点以及它们的投影位置时 xff0c 如何估计相机所
  • Ubuntu 简单的视频剪辑方法

    视频剪辑主要分为两种 xff1a 1 纯粹的录屏 xff0c 不增加停顿 文字说明等 2 在关键位置停顿 xff0c 并配以文字说明 xff1b 针对第二种情况 xff0c 可以把要处理的视频保存成图片 xff0c 然后再利用opencv进
  • [cartographer] 9. proto配置文件读取

    目录 1 proto文件 2 lua配置文件 3 代码 1 xff09 读取lua文件 2 xff09 赋值给proto options 获取proto参数值有两种方式 xff1a 1 xff09 lua文件 2 xff09 通过servi
  • [毫米波雷达建图系列]2. map generator node

    目的 xff1a 利用点云 xff0c 生成概率栅格地图 xff0c 并保存成 pgm 图片格式 主要的函数有三个 xff1a void GetGridMap 注册地图 SaveMap 可以保存成 pgm图片 或者 pcd 格式 xff08
  • 常见的旋转插值

    1 四元数slerp插值 slerp 插值的原理 xff1a 这里 slerp 插值的工程实现 xff1a eigen 的 slerp 函数 Eigen Quaterniond q 61 q0 slerp x0 q1 2 轴角插值 已知 R
  • docker限制cpu使用率

    start docker docker run itd name CONTAINER NAME privileged network host ipc 61 host hostname CONTAINER NAME env COLORFGB
  • Visual Studio + Opencv配置

    目录 Opencv安装 环境变量配置Visual Studio 库的两种配置 本文使用操作系统为Windows10 xff0c 仅适用于windows环境Visual Studio编译器上的 Opencv开发配置 Opencv所有平台通用的
  • jupyter notebook import torch报错

    create pytorch env 进入 pytorch 环境 conda activate pytorch name 安装jupyter notebook 安装ipykernel 用于安装kernel conda install ipy
  • 分享本地文件给其他人访问

    在想分享的文件夹下执行 python3 m http server 9999 https blog csdn net inter peng article details 121332985 为了保证不用每次都自己手动输入上述命令 xff0
  • C++ 文件读写fopen_s/fopen

    最好使用fopen s xff0c 使用fopen提示 not safe xff0c 二者区别如下 xff1a 1 fopen s的安全是在于比函数fopen多了溢出检测 2 在使用上 xff0c 函数fopen的返回值是文件指针 xff0
  • 齐次线性方程组和非齐次线性方程组

    定义 齐次线性方程组 等式右侧常数项全部为0 非齐次线性方程组 等式右侧常数项不全部为0 2 齐次方程组的求解 将系数矩阵化为行阶梯形矩阵 xff0c 记全为0的行数量为r 61 n R A 则非零行的首非零元所在列对应的就是约束变量 其余
  • C++求解汉明距离

    目录 汉明距离介绍汉明距离应用解法1 xff1a Brian Kernighan算法解法2解法3 汉明距离介绍 leetcode 461 汉明距离 xff0c 难度 xff1a 简单 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不
  • Qt无边框窗口,自定义标题栏,可拉伸,拖动,Qt5/6通用,windows, linux通用

    项目链接 gitee xff1a https gitee com linghuzhangmen qtframeless 截图 Qt6 4可编译 主要功能 xff08 1 xff09 自定义标题栏 可拖动 拉伸 xff1b xff08 2 x
  • QToolButton用法记录

    QToolButton是工具按钮 可以设置图标 文本 也可以结合qss灵活设置样式 例如下面的效果 点击之后 代码如下 include widget h include ui widget h include lt QDebug gt Wi
  • C#不使用配置文件封装log4net

    先使用NuGet安装log4net 如下图 log4net封装类 span class token keyword using span span class token namespace log4net span class token
  • Qt QTextEdit使用总结

    目录 QTextEdit类 QTextEdit基本用法 1 创建QTextEdit对象 2 设置文本 3 获取文本 4 插入文本 5 设置字体 字号和颜色 6 设置对齐方式 7 撤销和重做 8设置只读模式 9 信号与槽 10 多行显示 QT
  • C++ Qt智能指针使用教程

    C Qt智能指针使用教程 contents 一 QSharedPointer用法 二 QWeakPointer 三 QScopedPointer 四 QPointer 五 Qt智能指针需要注意的坑 Qt提供了类似C 11智能指针的实现 用于
  • 编程题:有两个字符串str1和str2,写一个函数实现在str1中查找str2的初始位置,要求不区分大小写

    编程题 xff1a 有两个字符串str1和str2 xff0c 写一个函数实现在str1中查找str2的初始位置 xff0c 要求不区分大小写 思路 xff1a 1 xff1a 首先判断两个字符串的大小 xff0c 作初步比较 2 xff1
  • vscode对C++程序进行调试

    调试helloworld 先建立一个文件夹然后在文件夹 xff0c 创建一个test cpp 写下一下内容 span class token macro property span class token directive hash sp

随机推荐

  • C++模拟go defer

    go defer介绍 在Go语言中 defer语句用于在函数返回之前执行一些代码 这对于释放资源或记录函数执行时间非常有用 当函数中有多个defer语句时 它们将按照后进先出 LIFO 的顺序执行 以下是一个简单的示例 演示了如何使用def
  • C++设计模式13:责任链模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式7:桥接模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式8:组合模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式11:享元模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式15:解释器模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式16:迭代器模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式21:策略模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式18:备忘录模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式20:状态模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • stm32直流电机驱动与测速

    stm32直流电机驱动与测速 说实话就现在的市场应用中stm32已经占到了绝对住到的地位 xff0c 51已经成为过去式 xff0c 32的功能更加强大 xff0c 虽然相应的难度有所增加 xff0c 但是依然阻止不了大家学习32的脚步 x
  • C++设计模式22:模板方法模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++ 设计模式23:访问者模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式17:中介者模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式14:命令模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • GPS 和 RTK 定位

    refers xff1a https blog csdn net u012241570 article details 80802675 GPS定位的基本原理 测量出已知位置的卫星到地面GPS接收器之间的距离 xff0c 然后接收器通过与至
  • 关于GD32的CMakeLists以及gcc部分编译选项的解释

    set CMAKE SYSTEM NAME Generic cmake最低版本 cmake minimum required VERSION 3 0 0 工程名称 语言 project TEST PRJ NAME LANGUAGES C C
  • ulimit -s 指定栈上的内存上限

    转自 xff1a http blog chinaunix net uid 24439730 id 144094 html ulimit s 指定栈上的内存上限 xff0c 单位为KB xff0c 如 xff1a root 64 wdqf1w
  • C++头文件重复包含问题

    为了避免同一个文件被include多次 有两种方式 1 span class token macro property span class token directive keyword ifdef span SOMEFILE H spa
  • TCP(select函数模型)

    客户端代码 include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt include lt st