select监听多个socket的例子

2023-05-16

         先贴上代码,回头再仔细编辑。

         server.cpp:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>

#include <vector>
using namespace std;

int main(int argc,char* argv[])
{
    printf("server start up\n");

    if(argc <= 3)
    {
        printf("usage:%s ip port backlog\n",basename(argv[0]));
        return 1;
    }

    //IP地址
    const char* ip = argv[1];
    //端口号
    int port = atoi(argv[2]);
    //内核监听队列的最大长度(完全连接的socket)
    int backlog = atoi(argv[3]);

    //创建socket	(TIP/IP协议族,流式socket)
    int server_sockfd = socket(PF_INET,SOCK_STREAM,0);

    //最大连接数,初始化为server_sockfd
    int max_fd = server_sockfd;

    //
    vector<int>	 connFds;
    connFds.reserve(backlog);

    //TCP/IP协议族的socket地址结构体
    struct sockaddr_in server_addr;
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family = AF_INET;			//TCP/IPv4的地址族
    inet_pton(AF_INET,ip,&server_addr.sin_addr);		//将IP地址字符串转换为二进制的整数并赋给addr.sin_server_addr
    server_addr.sin_port = htons(port);			//端口,host to net,将主机字节序(小端)转换为网络字节序(大端)

    //将文件描述符sock和socket地址关联,仅服务端需要,客户端自动绑定地址
    //注意需要强制转换为 struct sockaddr*
    int ret = bind(server_sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
    assert(ret != -1);

    //监听
    ret = listen(server_sockfd,backlog);
    assert(ret != -1);

    //客户端地址信息
    struct sockaddr_in client_addr;
    socklen_t client_addrlength = sizeof(client_addr);

    char buf[1024];
    memset(buf,0,sizeof(buf));

        //文件描述符集合
    fd_set read_fds;
    fd_set  exception_fds;
    FD_ZERO(&read_fds);
    FD_ZERO(&exception_fds);

        //超时
    struct timeval timeout;
    timeout.tv_sec = 30;             //妙
    timeout.tv_usec = 0 ;            //微秒

    while(1)
    {
        FD_SET(server_sockfd,&read_fds);
        for(int i =0;i<connFds.size();++i)
        {
            FD_SET(connFds[i],&read_fds);
            FD_SET(connFds[i],&exception_fds);
        }

        int ret = select(max_fd+1,&read_fds,NULL,&exception_fds,NULL);
        if( ret  ==  -1)
        {
            perror("select");
            break;
        }
        else if( ret == 0)
        {
            perror("timeout");
            break;
        }

        for(vector<int>::iterator it = connFds.begin();it != connFds.end();)
        {
            memset(buf,0,sizeof(buf));

            if( FD_ISSET(*it,&read_fds) )
            {
                int ret = recv(*it,buf,sizeof(buf)-1,0);
                if(ret <= 0)
                {
                    perror("recv");
                    close(*it);
                    FD_CLR(*it,&read_fds);
                    it = connFds.erase(it);
                    printf("A client disconnectd\n");
                    continue;
                }

                    buf[ret] = '\0';
                    printf("%s",buf);
            }
            else  if(FD_ISSET(*it,&exception_fds))
            {
                int ret = recv(*it,buf,sizeof(buf)-1,MSG_OOB);
                if(ret < 0)
                {
                    perror("exception");
                }
                else
                {
                    buf[ret] = '\0';
                    printf("%s",buf);
                }

            }

            ++it;
        }

        if( FD_ISSET(server_sockfd,&read_fds) )
        {
            //接受连接,并将被接受的远端sock地址信息保存在第二个参数中
            int newfd = accept(server_sockfd,(struct sockaddr*)&client_addr,&client_addrlength);

            if(newfd < 0)
            {
                perror("accept");
                return -1;
            }
            else
            {
                connFds.push_back(newfd);
                max_fd = newfd;
                //inet_ntoa(struct addr_in) 将IP地址转换为字符串并返回
                //只是从监听队列中取出连接,即使客户端已经断开网络连接也会accept成功
                printf("accept client_addr %s\n",inet_ntoa(client_addr.sin_addr));
            }
        }

    }


    //关闭连接,实际只是socket的引用-1,必须引用为0才会真正关闭
    for(int i= 0;i< connFds.size();++i)
    {
        close(connFds[i]);
    }

    close(server_sockfd);
    return 0;
}

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

select监听多个socket的例子 的相关文章

  • winxp 远程rdp 连接 Ubuntu10.10-再次远程登陆失败 (二)

    在文章winxp 远程rdp 连接 Ubuntu10 10 一 操作完成 xff0c 并且进行第一成功登陆之后 xff0c 退出 xff08 注销 直接关闭mstsc退出按钮 xff09 远程连接之后 xff0c 重新登录出现 xff0c
  • PostGIS教程七:几何图形(Geometry)

    目录 一 介绍 二 元数据表 三 表示真实世界的对象 3 1 点 xff08 Points xff09 3 2 线串 xff08 Linestring xff09 3 3 多边形 xff08 Polygon xff09 3 4 集合 xff
  • FreeBSD下修改安装源的方法

    FreeBSD默认是从官方的源下载软件包的 xff0c 速度比较慢 xff0c 可以修改配置文件指定国内的镜像源来快速安装软件 说明 xff1a FreeBSD中安装软件一般有两种方式 xff1a xff08 一 xff09 使用pk ad
  • sqlite3_bind

    sqlite3 bind text 中绑定的指针 xff0c 在sqlite3 step 时必须存在 xff0c 不能释放 xff0c 否则会是乱码 sqlite3 bind blob中绑定的指针 xff0c 在sqlite3 step 时
  • Windows10 Clion 无法打开文件cudart.lib

    真是巨坑 xff0c 遇到这个问题 xff0c 且耗费两个小时百度 google xff0c 差点放弃换用Visual Studio xff0c 但真实原因竟然这么简单 在你的CmakeList txt中 xff0c 是不是这样添加cuda
  • cf规则介绍

    codeforces的正确打开方式 1 背景 可能很多人都久闻codeforces网站的大名 xff0c 却苦于各种各样的区域性问题或玄学问题 xff0c 没能真正地体验到cf所带来的极致魅力 而网络上关于这方面的博文太少了 xff08 至
  • 使用Buildroot + QEMU构建和运行Linux

    使用Buildroot 43 QEMU构建和运行Linux xunknown 64 2022 04 06 概述 Buildroot是一个用于为嵌入式系统构建完整的Linux系统 xff08 包括Bootloader xff0c Linux
  • openwrt 无线中继设置–固定IP+打印服务器和文件共享

    openwrt 无线中继设置 固定IP 43 打印服务器和文件共享 因为给TPLINK703N xff0c 编译16MROM成功 xff0c 固件里加入了打印服务器和SAMBA VSFTPD USB挂载等功能 xff0c 可使用有线连接上级
  • Linux 终端(TTY)

    原文 xff1a Linux 终端 TTY sparkdev 博客园 Linux 终端 TTY TTY 是 Teletype 或 Teletypewriter 的缩写 xff0c 原来是指电传打字机 xff0c 后来这种设备逐渐键盘和显示器
  • shell命令和变量//区分变量未定义和变量已定义但值为空

    转载 xff1a Shell Command Language 参考 xff1a shell How to check if a variable is set in Bash Stack Overflow 关键 xff1a 形如 para
  • 区分本地终端和ssh远程终端

    如果本地和远端服务器用户名和主机名 xff0c 终端颜色配置都一致 xff0c 通过ssh登陆服务器的时候 xff0c 在本地终端和ssh终端来回切换时 xff0c 傻傻分不清当前终端是本地终端还是ssh远程服务器 下面这个连接介绍了一种方
  • 电路仿真软件Circuit JS1修改菜单字体大小

    在线演示 xff1a https www falstad com circuit circuitjs html 下载地址 xff1a https www falstad com circuit offline circuitjs1 linu
  • Ubuntu 22.04配置samba服务器

    安装samba sudo apt install samba 可以验证一下安装结果 xff1a smbd version 创建samba用户密码 创建samba用户 xff08 可选 xff09 xff1a sudo adduser sys
  • 一个查找文件的类:它的长处在于能够搜索子目录并且是可控制的

    find file cpp Defines the entry point for the console application include 34 stdafx h 34 测试需要的头文件 include lt conio h gt
  • Clearwater IMS All-in-one环境搭建指导书

    xunknown 64 163 com 2015 01 13 一 前言 Clearwater IMS 是一个开源的 IMS 项目 提供 VoIP SIP 电话等功能 Clearwater IMS 主页 http www projectcle
  • Clearwater IMS All-in-one环境搭建指导书

    xunknown 64 163 com 2015 01 13 一 前言 Clearwater IMS 是一个开源的 IMS 项目 提供 VoIP SIP 电话等功能 Clearwater IMS 主页 http www projectcle
  • Sublime Text3注册码(亲测可用 2019-11-19)

    转自博客中的朋友的 xff0c 用于保存 适用于Sublime Text2同时也适用于Sublime Text3 1 打开本地hosts文件 Windows路径是C Windows System32 drivers etc MacOS路径是
  • H3C配置多区域OSPF实验

    一 先上拓扑 xff1a 二 实验环境 xff1a Windows 10 xff08 21H1 xff09 xff0c HCL版本 xff1a V3 0 1 xff08 华三模拟器 xff09 三 实验需求 xff1a SWA SWB SW
  • 配置mysql使用ssl连接,配置java连接mysql使用ssl

    查看mysql是否支持ssl连接 show variables like 39 ssl 39 生成服务器端 openssl genrsa 2048 gt ca key pem openssl req sha1 new x509 nodes
  • Python中的命名规范

    变量命名准则 您应当尽量使自己的变量命名含义清晰 xff0c 不要使用混乱的字母 数字 表情等意义不明的字符来命名变量一般来说 xff0c 您不应当使自己的风格频发变换 如果可能 xff0c 请将整个项目保持统一风格此文章根据本人习惯与编码

随机推荐

  • Linux下达梦数据库的安装与卸载

    文章目录 Linux下达梦数据库的安装与卸载1 安装前准备工作1 1 下载安装包1 2 检查Linux Unix 系统信息1 3 创建安装用户1 4 Linux Unix 下检查操作系统限制1 5 设置JAVA环境 2 安装DM2 1 解压
  • 递归算法实现角谷定理

    问题重述 xff1a 角谷定理 输入一个自然数 xff0c 若为偶数 xff0c 则把它除以 2 xff0c 若为奇数 xff0c 则把它乘以 3 加 1 经过如此有限次运算后 xff0c 总可以得到自然数值 1 求经过多少次可得到自然数
  • windows系统关闭node进程

    taskkill f t im node exe Node js是一个开源的 跨平台的JavaScript运行时环境 xff0c 它允许开发者在服务器端使用JavaScript进行编程 Node js的诞生极大地扩展了JavaScript的
  • 我的GPT-4 API 接入之旅

    3月15日open ai推出GPT 4 https platform openai com docs models gpt 4 chatgpt免费体验入口 xff1a http chat xutongbao top 需要排队 28号加入等候
  • IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

    git exe pull progress v no rebase 34 origin 34 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 6
  • 制作高清chatgpt logo

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta http equiv 61 34 X U
  • react开发前端登录、注册、找回密码页面的详细教程

    登录 注册 找回密码是前端项目经常遇到的需求 光标自动定位到输入框 回车登录 图形验证码 邮箱验证码 60秒倒计时 字段校验 字段提示语 上传头像 密码显示隐藏这些功能都会在本文中详细介绍 xff0c 注意 使用的ui库是antd 目录 光
  • azure windows服务器,远程桌面链接,ftp文件上传下载

    解决方案 xff1a FTP 安装filezilla 打开21端口 参考链接 xff1a Windows11 10 使用RDP远程桌面时提示 您的凭据不工作 登录没有成功可能的一种原因 CSDN博客 使用 SSH 连接到运行 Windows
  • LED的使用纯汇编和C语言的点亮

    概述 我们通过观察原理图可以发现LED灯有四个分别连接在GPM4 1 GPM4 2 GPM4 3 GPM4 4上面 xff0c 这时候我们去查询我们板子4412的说明书 xff0c 去寻址寄存器的配置 初始化的时候我们需要将他配置为输出模式
  • Promise异步编程

    目录 一 Promise的含义 二 基本用法 三 reject的用法 四 执行顺序 五 项目中使用promise获取后端数据 六 catch的用法 七 finally的用法 八 Promise all 九 Promise all 有一个是失
  • 介绍一下ES6 promise

    ES6 Promise 是 ECMAScript 2015 xff08 简称 ES6 xff09 引入的一种处理异步操作的编程模式 Promise 可以简化异步编程 xff0c 并使代码更易于维护 一个 Promise 对象代表一个尚未完成
  • ChatGPT的N种用法(持续更新中。。。)

    目录 前言 一 写代码 二 给软件系统命名 三 查询发展历史 四 写英语短文 五 入党申请报告指导 国企员工思想汇报 六 给小孩起名字 七 给小说写推荐阅读 八 根据小说生成剧本 九 写离婚协议 十 翻译 十一 润色文章 十二 用英文撰写电
  • ChatGPT资料汇总学习

    x1f9e0 Awesome ChatGPT ChatGPT资料汇总学习 xff0c 持续更新 ChatGPT再一次掀起了AI的热潮 xff0c 是否还会像BERT一样成为AI进程上的里程碑事件 xff0c 还是噱头炒作 xff0c 持续关
  • Stable Diffusion 本地部署教程不完全指南

    ChatGPT免费体验入口网址 http chat xutongbao top 参考链接 xff1a ERROR Could not find a version that satisfies the requirement torch 6
  • Stable Diffusion +ChatGPT+文本转语音+剪映制作视频

    目录 chatgpt免费体验入口网址 模型下载 huggingface co civitai com 使用Deliberate模型案例 StableDeffusion做的图片 xff0c chatGPT出的文案 xff0c 微软文本转语音配
  • 如何使用 ChatGPT 生成 Stable diffusion 提示词

    chatgpt免费体验入口网址 xff1a http chat xutongbao top 一 教chatgpt写提示词 StableDiffusion是一款利用深度学习的文生图模型 xff0c 支持通过使用提示词来产生新的图像 xff0c
  • Stable Diffusion+Deliberate模型绘制图片

    chatgpt免费体验入口网址 xff1a http chat xutongbao top 正向提示词 1 chinese gril with headphones natural skin texture 24mm 4k textures
  • prompt交易平台

    chatgpt免费体验入口网址 xff1a http chat xutongbao top prompt交易平台 https promptbase com prompt需要花钱购买 也可以售卖自己的prompt 关注公众号领福利
  • New Bing来了

    chatgpt免费体验入口网址 xff1a http chat xutongbao top 参考链接 xff1a https mp weixin qq com s x8RUxofqS43xkZM 5xnTAw
  • select监听多个socket的例子

    先贴上代码 xff0c 回头再仔细编辑 server cpp include lt sys types h gt include lt sys socket h gt include lt netinet in h gt include l