windows下的C++ socket服务器(2)
int make_server_socket(int port);//
void handleAccept(int socket_fd);//
int main(int ac, char *av[])
{
int tcp_socket = make_server_socket();
if (tcp_socket == -)
{
exit();
}
thread t;//
while ()
{
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");
}

而如果我们把注释去掉就可以正常运行了,同样将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中发现

所以SOCKET和int是可以进行转换的。
windows下的C++ socket服务器(2)的更多相关文章
- windows下的C++ socket服务器(1)
windows下的一个C++ socket服务器,用到了C++11的相关内容,现在还不是很完善,以后会不断改进的! #include <winsock2.h>//1 以后会用这种方式对特定 ...
- windows下的C++ socket服务器(3)
int make_server_socket(int port) { WSADATA inet_WsaData; WSAStartup(MAKEWORD(), &inet_WsaData); ...
- windows下的C++ socket服务器(4)
void handleAccept(int socket_fd) { ] = { '\0' }; string cmd; string filename; recv(socket_fd, buf, ) ...
- windows下运行的linux服务器批量管理工具(带UI界面)
产生背景: 由于做服务器运维方面的工作,需要一人对近千台LINUX服务器进行统一集中的管理,如同时批量对LINUX服务器执行相关的指令.同时批量对LINUX服务器upload程序包.同时批量对LINU ...
- syslog之三:建立Windows下面的syslog日志服务器
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
- Windows下搭建本地SVN服务器【转】
转自:http://www.linuxidc.com/Linux/2015-01/111563.htm 本文介绍Windows下搭建本地SVN服务器的方法,网上资料比较少也比较旧,大都介绍的是旧版本S ...
- Windows下IIS搭建Ftp服务器
第一步:启用Windows IIS Web服务器 1.1 控制面板中找到"程序"并打开 1.2 程序界面找到"启用或关闭Windows功能"并打开 1.3 上面 ...
- Windows下svn客户端和服务器的安装使用
svn,全称subversion, 是目前用的较多的开源的版本管理工具.相信有些经历的程序员应该都听说过它. 通常的svn服务器是搭建在Linux中,不过如果作为个人或者单个小组使用的话,就可以把sv ...
- Windows下搭建HTTP/HTTPS服务器及测试过程
1 安装Apache http://www.apachehaus.com/cgi-bin/download.plx 选择合适的版本下载 本次下载的是 Apache 2.4.x VC14 Apache版 ...
随机推荐
- Verilog_Day2
Verilog_Day1 在CSDN博客上.http://blog.csdn.net/m0_38073085 第三章: 书上基本知识 每个Verilog程序包括4个主要部分:端口定义,I/O说明,内部 ...
- Kubernetes学习之路(十)之资源清单定义
一.Kubernetes常用资源 以下列举的内容都是 kubernetes 中的 Object,这些对象都可以在 yaml 文件中作为一种 API 类型来配置. 类别 名称 工作负载型资源对象 Pod ...
- $.ready和onload 区别
1.jq ready()的方法就是Dom Ready 他的作用或者意义就是:在DOM加载完成后就可以可以对DOM进行操作. 一般情况先一个页面响应加载的顺序是,域名解析-加载html-加载js和css ...
- 快速上手IOT视觉化开发工具Node-RED
作者:何信昱 现在有越来越多非专业背景但有创造热诚的Maker,想要进入物联网领域大展身手,但常常苦于无法撰写艰深难懂的程序代码,以及想要连接各种硬件与时下最流行的社群软件,却不知道如何使用开放给开发 ...
- 通过Task异步加快对数组的运算
一.介绍 Task是.NetFramework3.0出现的,线程是基于线程池,然后提供了丰富的API. 先用AverageAssign方法把一组数据平均分成n组,再通过遍历n组数据,循环开Task多线 ...
- CSS盒模型 flex
用于网页布局,PC的话,兼容性不够,慎用,手机端的话,神器 整理部分通用的,可以直接复制的,省得下次再写一遍 注意,设为 Flex 布局以后,子元素的float.clear和vertical-alig ...
- linux镜像(持续更新)
Linux系统历史衍生图:https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg ubu ...
- Python之Django基本命令
一.新建项目 $django-admin.py startproject project_name # 特别是在 windows 上,如果报错,尝试用 django-admin 代替 django-a ...
- load和loads的区别
相同点 load 和loads 都是实现"反序列化" 区别 1.loads loads针对内存对象 loads: 将 字符串 转换为 字典 # 这是一个字符串'{"b&q ...
- MergeSort 归并排序(java)
MergeSort 归并排序 排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素 2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1 3,子列元素个数为 ...