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)的更多相关文章

  1. windows下的C++ socket服务器(1)

    windows下的一个C++ socket服务器,用到了C++11的相关内容,现在还不是很完善,以后会不断改进的! #include <winsock2.h>//1 以后会用这种方式对特定 ...

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

    int make_server_socket(int port) { WSADATA inet_WsaData; WSAStartup(MAKEWORD(), &inet_WsaData); ...

  3. windows下的C++ socket服务器(4)

    void handleAccept(int socket_fd) { ] = { '\0' }; string cmd; string filename; recv(socket_fd, buf, ) ...

  4. windows下运行的linux服务器批量管理工具(带UI界面)

    产生背景: 由于做服务器运维方面的工作,需要一人对近千台LINUX服务器进行统一集中的管理,如同时批量对LINUX服务器执行相关的指令.同时批量对LINUX服务器upload程序包.同时批量对LINU ...

  5. syslog之三:建立Windows下面的syslog日志服务器

    目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...

  6. Windows下搭建本地SVN服务器【转】

    转自:http://www.linuxidc.com/Linux/2015-01/111563.htm 本文介绍Windows下搭建本地SVN服务器的方法,网上资料比较少也比较旧,大都介绍的是旧版本S ...

  7. Windows下IIS搭建Ftp服务器

    第一步:启用Windows IIS Web服务器 1.1 控制面板中找到"程序"并打开 1.2 程序界面找到"启用或关闭Windows功能"并打开 1.3 上面 ...

  8. Windows下svn客户端和服务器的安装使用

    svn,全称subversion, 是目前用的较多的开源的版本管理工具.相信有些经历的程序员应该都听说过它. 通常的svn服务器是搭建在Linux中,不过如果作为个人或者单个小组使用的话,就可以把sv ...

  9. Windows下搭建HTTP/HTTPS服务器及测试过程

    1 安装Apache http://www.apachehaus.com/cgi-bin/download.plx 选择合适的版本下载 本次下载的是 Apache 2.4.x VC14 Apache版 ...

随机推荐

  1. Linux下查看Mysql数据库端口的方法

    mysql 默认的端口是 3306,但是如果在安装的时候,修改了mysql的默认端口的话,可以采用以下方式查看 第一种方法: 直接查看数据库的配置文件 在/etc/mysql/my.cnf(Linux ...

  2. springboot之assembly的文件配置

    一.在使用springboot框架的时候,存在一个问题.就是我们配置yaml文件,需要单独提出来做参数修改.当然这个是可以通过spring.profiles.active的方式来配置dev,prod等 ...

  3. JAVA基础 XML生成与解析和String包装类下 .replace方法的使用以及char和字符序列的使用场景

    ptLink0.setText(arbu.getPtLink().replace("&","&")); // 如果像 '&','& ...

  4. Object C学习笔记11-数组

    在Object C也提供了类似C#中的Array数组对象,在Object C中使用NSArray 来创建数组:但是在Object C中NSArray 只能存放对象类型的指针,不能存放int,char, ...

  5. 菜鸟vimer成长记——第2.1章、normal模式

    目的 掌握normal模式下常用操作的语法和概念,这些操作对应的应用场景以及实用技巧. 通过normal模式举一反三掌握cmd-line和visual的常用文本操作. 简介 文本操作的理想状态为:一个 ...

  6. Spring学习(十八)----- Spring AOP+AspectJ注解实例

    我们将向你展示如何将AspectJ注解集成到Spring AOP框架.在这个Spring AOP+ AspectJ 示例中,让您轻松实现拦截方法. 常见AspectJ的注解: @Before – 方法 ...

  7. 大数据中Hadoop集群搭建与配置

    前提环境是之前搭建的4台Linux虚拟机,详情参见 Linux集群搭建 该环境对应4台服务器,192.168.1.60.61.62.63,其中60为主机,其余为从机 软件版本选择: Java:JDK1 ...

  8. 【DOS】COPY命令

    一:文件复制COPY 指令说明:复制一个或更多文件到指定位置,可以合并文件 语法:COPY [/A/B] source[/A|/B] [+source [/A|/b] [+...]][destinat ...

  9. JUC——线程同步锁(LockSupport阻塞原语)

    java.util.concurrent.locks.LockSupport这个是一个独立的类,这个类的主要功能是用来解决Thread里面提供的suspend()(挂起线程).resume()(恢复运 ...

  10. CentOS7的安装与配置

    Linux系统以前接触的不多,主要是公司的网站部署在了一台安装了Ubuntu系统的机器上.是典型的LAMP架构的产物,因为偶而需要更新网站内容及需要定期备份.所以学习了一些Ubuntu & A ...