windows下的C++ socket服务器(2)

2023-11-15

windows下的C++ socket服务器二

int make_server_socket(int port);//1
void handleAccept(int socket_fd);//2
int main(int ac, char *av[])
{
    int tcp_socket = make_server_socket(8888);
    if (tcp_socket == -1)
    {
        exit(0);
    }
    thread t;//3
    while (1)
    {
        int socket_fd = accept(tcp_socket, nullptr, nullptr);  //4  
        t = thread(handleAccept, socket_fd);//3
        t.detach();//3
    }
    
    system("pause");
}

1.int make_server_socket(int port) 用于创建服务端的socket的函数,将在后面进行讲解。

2.void handleAccept(int socket_fd) 用于处理连接到服务端的客户端的函数,将在后面进行讲解。

3.thread C++11中出现的用于多线程编程,需要#include <thread> ,以前涉及到多线程编程时,在windows中需要使用CreateThread,而在linux中需要用pthread_create函数

而当thread出现后,在代码层面上,windows和linux就统一了。

thread的构造函数,

template<class _Fn,class... _Args> 
explicit thread(_Fn&& _Fx, _Args&&... _Ax)

{

//     

}

简单来说第一个参数表示函数的名字,其余的参数表示第一个参数所对应函数的参数,模板中的…用到了C++11中的变长模板这一个概念。

比如 t=thread(handleAccept,socket_fd)// handleAccept 函数名字,该函数有一个int的参数,socket_fd对应该int 参数

 

在线程创建完成后,我用t.detach(),将线程与主线程分离开,这样线程在线程结束时,就会清空自动该线程所占用的栈空间。并且主线程也可以和支线程一起运行,不用等待支线程结束后才能继续执行。

而如果我们如果使用t.join();会导致主线程必须等待所有当前的支线程结束后才可以往下执行。这样就无法同时处理不同客户端的请求了

还有要注意的是thread默认的joinable值是true,这意味着线程是不会析构的,在重复对同一对象创建线程时是会异常终止的,我们需要使用detach()和join(),将joinable的值改为false

 

例如

void print()
{
    string a("hello");
    cout << a << endl;
}
int main(int ac, char *av[])
{
    thread t;
    t = thread(print);
    //t.detach();
    t = thread(print);
    //t.detach();
    
    system("pause");
}

搜狗截图14年03月04日2213_1

而如果我们把注释去掉就可以正常运行了,同样将t.detach()改为t.join()也可以。

 

关于thread的更多资料

http://www.oschina.net/translate/cplusplus-11-threading-make-your-multitasking-life

http://www.cnblogs.com/haippy/p/3236136.html

 

 

4.accept();

accept()函数在windows下

SOCKET accept(SOCKET s,sockaddr* addr,int* addrlen );

accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为该协议地址的长度。如果accpet成功,那么返回一个socket,代表与返回客户的TCP连接。

在本程序中

int socket_fd = accept(tcp_socket, nullptr, nullptr);

tcp_socket是我们创建的服务器的socket描述字,而协议地址和该协议地址的长度,我们这里不需要,就设置为nullptr(nullptr为C++11 新增的用于替代null)

 

在这里accept函数是阻塞的,在没有新连接请求来的情况下,accept一直在这里等,函数没有返回,程序也不会往下运行。。

 

大家可以发现accept在windows中返回的SOCKET类型,而我们用一个int型接受返回值。

大家可以在vs2013中发现

搜狗截图14年03月04日2230_2

所以SOCKET和int是可以进行转换的。

分类:  C++
标签:  socketwindowsC++11
(请您对文章做出评价)
« 上一篇: windows下的C++ socket服务器(1)
» 下一篇: windows下的C++ socket服务器(3)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows下的C++ socket服务器(2) 的相关文章

  • 合并升序链表系列(Java)

    LeetCode原题链接 21 合并两个有序链表 力扣 LeetCode 23 合并K个升序链表 力扣 LeetCode 目录 合并两个有序链表 题目表述 解法一 解法二 合并K个升序链表 题目描述 解法一 解法二 合并两个有序链表 题目表
  • 网络字节序与地址变换

    文章目录 1 主机字节序与网络字节序 2 字节序转换 Endian Conversions 1 主机字节序与网络字节序 CPU 向内存保存数据的方式有 2 2 2 种 这意味着 CPU 解析数据的方式也分为 2 2 2 种
  • unity3D-learnin:Priests and Devils

    阅读以下游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross t
  • datagrip 查询结果不能修改

    正常情况下 查询出来的结果集都能直接修改 工具栏会出现 符号 且修改后会出现要提交的提示 向上的绿色箭头 且主键字段会有一把钥匙的标识 如图 凡事总有意外 今天发现库中的A表查询结果不能修改 但B表又是可以修改的 更奇怪的是直接双击A表 打
  • RTL8762DK PWM(七)

    概述 本示例 只要介绍 如何使用PWM 又离成功进了一步 一 环境 1 硬件 RTL8762DK 128M Bits Falsh 2 软件 keil IDE 二 PWM的使用 1 创建examples ble pwm工程 基于 exampl
  • 【狂神】MySQL - Delete 和 Truncate 的区别

    1 DELETE 命令 语法 delete from 表名 where 条件 删除数据 避免这样写 会全部删除 DELETE FROM student 删除指定数据 DELETE FROM student WHERE id 1 2 TRUN
  • react-属性默认值与类型验证

    属性默认值 react提供了属性默认值的设置方法 defaultProps App js import React Component from react import ClassDefault from components Class
  • matlab变电站仿真,基于Matlab Simulink的110kV变电系统建模及故障仿真分析

    龙源期刊网 http www doczj com doc 3c7690b958fb770bf78a55d0 html 基于Matlab Simulink的110kV变电系统建模及故障仿真分析 作者 杨涛 来源 建筑工程技术与设计 2014年
  • 0.前言 与 Eigen库的使用整理

    C 基于Eigen库实现CRN前向推理 前言 背景 与 Eigen库的使用整理 前言 Eigen库使用记录 第一部分 WavFile class 实现读取wav pcm 实现STFT 第二部分 Conv2d实现 第三部分 Transpose
  • vue ref是在组件里唯一吗_见解vue3.0-纠结用 ref 还是 reactive

    用人人都听得懂的话来阐述 ref reactive isRef toRefs ref 函数用来根据给定的值创建一个响应式的数据对象 ref 函数调用的返回值是一个对象 这个对象上只包含一个 value 属性 count import ref
  • 迪杰斯特拉算法 旅游规划

    目录 题目描述 AC代码 题目描述 有了一张自驾旅游路线图 你会知道城市间的高速公路长度 以及该公路要收取的过路费 现在需要你写一个程序 帮助前来咨询的游客找一条出发地和目的地之间的最短路径 如果有若干条路径都是最短的 那么需要输出最便宜的
  • DELL旧服务器清空原有磁盘配置、划分新磁盘安装系统的方法

    https blog csdn net qingsongleo article details 31788075 有很多创业公司为了节省成本 会通过一些途径购买二手的服务器 二手服务器不能直接使用 因为服务器里现存的配置可能和自己的生产环境
  • 【JDK】Mac版安装JDK并配置环境

    参考文章地址 https www cnblogs com dingzhijie p 7016397 html https blog csdn net deliciousion article details 78046007 教程内容为在M
  • linux日志生成速率统计,Linux学习29-awk提取log日志信息,统计日志里面ip访问次数排序...

    前言 有一段log日志 需从日志里面分析 统计IP访问次数排序前10名 查看是否有异常攻击 日志提取 如下日志 这段日志包含的信息内容较多 我们希望提取ip 访问时间 请求方式 访问路径 不带参数 状态码 123 125 72 61 05
  • numpy.empty的用法

    一 用法 np empty shape dtype float order C 二 参数 shape 返回空数组的维度 dtype 指定输出数组的数值类型 order 是否在内存中以C或fortran 行或列 顺序存储多维数据 三 返回值
  • qt Connect 连接两种方式

    https blog csdn net xiezhongyuan07 article details 79247022 写的挺清楚
  • python画玫瑰图_python之windrose风向玫瑰图的用法-Go语言中文社区

    1 安装 A package is available and can be downloaded from PyPi and installed using pip install windrose Install latest deve

随机推荐

  • SamlSsoClient

    Copyright C 2009 Google Inc Licensed under the Apache License Version 2 0 the License you may not use this file except i
  • 显示具体化、显示实例化、隐式实例化

    讨论这三者的区别我们要先认识函数模板 函数模板是C 新增的功能 他会创建一个通用的函数以支持多种不同类型的形参 避免函数体的重复设计 在我们需要重复用到某一段代码但是需要处理不同类型的参数时 使用函数模板是很方便的一个手段他最大的特点是把数
  • 列可以设置 :formatter,对列的值进行处理

    需要对数字进行处理
  • 美图2022年财报:AIGC引领创新,多重驱动共振向上

    2022年是美图发展的关键之年 在数字化趋势加速的背景下 美图通过持续优化用户体验和不断拓展业务领域边界 进一步巩固了其行业竞争优势 近日 美图公司发布2022财年年度业绩 在收入 用户 创新等方面均取得了令人瞩目的成绩 展现了强劲的发展势
  • VMware导入vmdk文件(亲测有效)

    场景 从别的地方拷贝了一个系统镜像 后缀是vmdk格式 现在演示如何导入到本地 操作步骤 打开vmware 点击文件 新建虚拟机 2 选择自定义 高级 下一步 3 硬件兼容性 默认选择最新的行 因为和本地安装的vmware版本有关 这里演示
  • Fiddler笔记(一)

    个人学习笔记 整理不易 有帮助点个赞 笔记目录 学习笔记目录 pytest和unittest airtest weixin 42717928的博客 CSDN博客 目录 一 简单了解 二 下载安装 三 工具使用 四 HTTP协议报文结构 1
  • 【操作系统】Linux常用基础和高级命令

    目录 一 Linux内核 二 Linux发行版 操作系统 三 Linux终端 三 Linux终端命令 1 命令格式 2 常用基础命令 1 查看目录命令 2 切换目录命令 3 创建文件和目录命令 4 删除文件和目录命令 5 复制文件和目录命令
  • 使用LeNet实现图像分类任务

    本篇的主要内容是解析一下使用MindSpore深度学习框架训练LeNet网络对Mnist数据集进行分类 首先我给大家展示出本篇内容的一个示意图 帮助大家更直观的看到训练过程的一个重要步骤 如图所示 其中1 2 3 表示训练过程中的次序 下面
  • RSA密码原理详解及算法实现(六步即可掌握)

    一 RSA算法概述 rsa算法是一种非对称加密算法 其安全性是建立在大素数难以分解的基础上的 即将两个大素数相乘十分容易 但想对其乘积进行分解却很困难 所以可以将其乘积公开作为加密密钥 二 RSA算法设计理念 根据数论 寻求两个大素数比较简
  • mysql默认值语句

    添加新字段 并设置默认值 alter table test tb add column col3 varchar 20 not null DEFAULT abc 修改原有默认值 alter table test tb alter colum
  • springboot整合logback

    1 在springboot项目resource目录下 创建一个 logback spring xml 文件 2 在logback spring xml文件中添加内容
  • vscode代码统计

    1 安装插件 在vscode界面左侧 点击图中所示的菜单项 搜索Vscode counter 2 使用插件统计代码 点击顶部 View 菜单 gt 在下拉选项中选择第一项 Command Palette gt 工作区选择VscodeCoun
  • 循环机换变速箱油教程_循环机更换自动变速箱油,需要更换的车友可以先了解一下...

    前言 了解汽车知识 让每一位车主维修保养不花冤枉钱 胖哥闲置快半年的自动变速箱循环机 今天终于再次开张了 说起这玩意一年也用不了几次 没有还真不行 自动变速箱油一般6万公里更换 具体大家可根据自己的 车辆保养手册规定 自动变速箱油更换有三种
  • ffmpeg视频裁剪

    需要注意 ffmpeg 命令 s 指定了宽高后 如果为奇数宽高 101 101 则裁剪后的视频无法正常播放 不加 s则ffmpeg自动 1处理 private void cutVideo throws Exception try Strin
  • 数组及常用方法

    思维导图 数组的基本概念 什么是数组 数组是存储一个或多个数据的容积 它是一组内存空间 通常用来批量处理数据 这组内存空间的名字叫做数组2 数组的特点 对齐自身储存的数据并没有什么要求 无论是数量还是类型 数组中的每一项可以是任意一种数据类
  • Eviews导入外部Excel数据并回归分析

    本文是计量学习中学习笔记 下面直接放截图 导入数据在这一步之前 需要注意Excel中的数据文件不能有中文字符 否则会报错 回归时需要先选中被解释变量 同时按住Ctrl建依次再选中解释变量 回归结果中可以看出 3 6的参数是不过检的 这说明原
  • cadence学习笔记(5)-从其他PCB(AD、PADS)导出Allegro使用的封装库

    一 AD转Allegro封装库 1 AD转ASCLL文件 2 一定要选择ASCLL文件 3 打开Allegro软件导入刚刚生成的PCB文件 4 转化完成的PCB AD原PCB 5 导出AllegroPCB封装库 6 生成的封装库文件 二 P
  • uni-app全局变量的存储和页面数据之间的传递

    https ask dcloud net cn article 35021 目录 1 变量存储 1 1使用公用模块存储 就是一个公共的页面 1 2 挂载到 Vue prototype存储 1 3使用globalData存储 1 4 使用vu
  • 阿里巴巴2014笔试总结

    昨天去笔试的 对我一个非计算机系的真的是略难 今天还能回忆起几道题目 就贴上来当个总结吧 单选第三题 比较两段程序哪个的效率更高 t1 for i 0 i lt 1000000 i for j 0 j lt 100 j expression
  • windows下的C++ socket服务器(2)

    博客园 闪存 首页 新随笔 联系 管理 订阅 随笔 16 文章 0 评论 33 windows下的C socket服务器二 int make server socket int port 1 void handleAccept int so