博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows下的C++ socket服务器(2)
阅读量:4569 次
发布时间:2019-06-08

本文共 2024 字,大约阅读时间需要 6 分钟。

int make_server_socket(int port);//1void handleAccept(int socket_fd);//2int 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");}

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

 

关于thread的更多资料

 

 

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是可以进行转换的。

转载于:https://www.cnblogs.com/magicsoar/p/3581334.html

你可能感兴趣的文章
锡瓦塔内霍 墨西哥 / 巴克斯顿 /
查看>>
css+html应用实例1:滑动门技术的简单实现
查看>>
C++智能指针 auto_ptr
查看>>
Direct3D 索引缓存
查看>>
Eclipse开发环境的配置
查看>>
Java集合框架的学习
查看>>
elasticsearch结构化查询过滤语句-----4
查看>>
P4783 【模板】矩阵求逆
查看>>
Bootstrap 警告框(Alert)插件
查看>>
centos7 离线源码安装 postgresql-9.6.6
查看>>
Java深入学习之 IO
查看>>
浅谈软件测试
查看>>
C# winform端 通过HttpWebRequest进行post和get请求,数据格式为json,后台java端接收,其中有关传输特殊字符(\t,\r,',\n,n)等处理...
查看>>
4069: [Apio2015]巴厘岛的雕塑
查看>>
yii2常用路径获取
查看>>
18 | 眼前一亮:带你玩转GUI自动化的测试报告
查看>>
Gitlab修改默认端口
查看>>
功能规格说明书
查看>>
JavaScipt30(第七个案例)(主要知识点:数组some,every,findIndex方法)
查看>>
Android 采用HttpClient提交数据到服务器
查看>>