2.3.4 创建新线程接收连接
在定义了线程函数之后,回到CTCPSocket_Server类的StartServer()函数中。接下来通过CreateThread()函数创建ThreadFunc_StartServer()的线程,接受来自客户端的连接。
(1)CreateThread()函数
该函数的作用是创建新线程,其格式为
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTE lpThreadAttributes
, SIZE_T dwStackSize
, LPTHREAD_START_ROUTINE lpStartAddress
, LPVOID lpParameter
, DWORD dwCreateFlags
, LPDWORD lpThreadId
);
其中,参数lpThreadAttributes
指定了线程的句柄是否能被子线程继承,如果该参数设置为
NULL
,则表示不能被继承;
dwStackSize
指定了新创建线程栈的初始大小,如果该参数设置为
0
,则表示栈的初始大小为默认值;
lpStartAddress
是线程函数的地址;
lpParameter
表示线程函数的参数;
dwCreateFlags
指定了线程创建时的控制标志,如果该参数设置为
0
,则表示线程在创建后马上运行;
lpThreadId
用于保存创建线程的
ID
,如果不需要线程
ID
,可将该参数设置为
NULL
。如果创建线程成功,则返回值为新创建线程的句柄,否则返回值为
NULL
。
(2)创建接受客户端连接的线程
在StartServer()函数中,通过以下代码创建接受客户端连接的线程
m_acceptthread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CTCPSocket_Server::ThreadFunc_StartServer, this, 0, NULL);
其中,ThreadFunc_StartServer
是“
2.3.3
定义线程函数”中定义的线程函数;
this
表示CTCPSocket_Server
类对象的指针,ThreadFunc_StartServer()
函数通过该指针可以访问CTCPSocket_Server
类的非静态成员。m_acceptthread_handle
是CTCPSocket_Server
类类型为HANDLE
的成员变量,用来保存线程的句柄。
2.3.5 创建接收数据线程函数
在接收了客户端连接之后,服务端接下来要接收客户端发送过来的数据。由于不知道客户端什么时候发送数据,所以服务端需要创建一个新的线程,一直准备接收数据。在NewConnect()函数中创建接收数据线程。在前文中已经提到,NewConnect()函数在StartServer()函数的结尾处调用的。在创建接收数据线程之前,首先要定义该线程对应的线程函数,在线程函数中完成对客户端数据的接收。
(1)声明接收数据的线程函数
在“2.3.3 定义线程函数”中提到,线程函数必须是全局函数或者是类的静态函数。首先,为CTCPSocket_Server类添加一个名为ThreadFunc_RecvData()的静态函数,其格式为
static DWORD ThreadFunc_RecvData(LPVOID lpParameter);