MFC基于select模型的套接字类之服务器(5)

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值