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

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");
}

C++ 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遭窥见

C++ 2

从而SOCKET和int是得拓展转移的。