郑州知网文化传播有限公司欢迎您!

知网和您谈---windows下的C++ socket服务器

作者:创始人 日期:2020-06-12 人气:9645
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");
}

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

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


你觉得这篇文章怎么样?

00

快捷导航

外贸网络营销方案 企业建设网页 客户软件服务 直销平台软件 seo郑州 直销软件开发操作系统 如何给公司做网络推广 做网站公司 安卓软件开发论坛 ios游戏用什么软件开发 网络推广下载 青岛网络推广 郑州软件开发机构 市场营销和策划 网络推广有那些平台 双轨直销软件大全 现在怎么做网络推广 网站的建设公司 网络广告营销推广 如何在网络上推广 软件开发app 企业网站建设的公司 软件开发高手 平台营销方案 郑州软件学院 ibm有分销商城 汽车网络营销方案 网络营销分享 三三直销软件 网络营销案例分析