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

C/SClient/Server)结构的网络软件分为客户端和服务端。客户端和服务端担任不同的任务。一般来说,客户端将用户的需求提交给服务端,再将服务端返回的结果以一定形式提供给用户。服务端的任务是接收客户端的服务请求,进行响应处理,并将结果返回给客户端。

本文提到的服务端的流程如图1所示。在服务端的主线程中创建接受客户端连接的线程,在该线程中创建多个接收客户端数据的线程用来与多个客户端进行通信。



服务端软件详细的流程如图2所示。

2中左侧的图是服务端主程序的流程图,从图中可以看出,对服务端的操作包含了创建、启动、发送/接收数据、关闭等。其中,在启动服务端时,创建了一个接受客户端连接的线程,如图2中间所示。接受客户端连接的线程中,对是否有客户端连接进行判断,如果有客户端连接,则创建接收客户端数据的线程,否则一直等待连接。接收客户端数据的线程流程如图2右侧所示,判断客户端是否发送数据,如果有数据则接收并处理该数据,否则继续等待客户端数据的到来。

本文主要通过一个类来实现服务器的创建、启动、发送/接收数据、关闭等操作。通过该类实现的服务器可以显示客户端IP地址和收到的数据等信息,并且可以向指定的客户端发送数据。

将该服务器类的名字设置为“CTCPSocket_Server”。该类含有四个public成员函数,分别是创建服务器的Create()函数、启动服务器的Start()函数、停止服务器的Stop()函数以及向客户端发送数组的SendData()函数。

1 创建服务器

通过CTCPSocket_Server类的Create()函数实现服务器的创建。首先为CTCPSocket_Server类添加访问权限为public的成员函数Create(),该函数的格式为

bool Create(u_short port, int backlog);
其中,port表示服务器监听的端口号, backlog表示服务器可以接收客户端等待链接的最大值。

创建服务器主要包含以下五步:初始化套接字动态库、创建套接字、绑定套接字、监听套接字以及创建线程接收套接字连接。

1.1 初始化服务器

为CTCPSocket_Server类添加private成员函数Init(),该函数的格式为

bool Init();
在该函数中,主要完成服务器使用的套接字动态库初始化的工作。通过WSAStartup()函数完成动态库的初始化工作。

Init()函数中,有如下代码

WSADATA wsadata;
WORD version = MAKEWORD(2, 2);
if( WSAStartup(version, &wsadata) != 0 )
{
     return false;
}
else
{
return true;
}
其中,WSADATA结构包含了安装启用 Windows套接字的信息, WSAStartup()函数的作用是初始化 Windows套接字动态库,第一个参数指定了 Windows套接字规格的最高版本, MAKEWORD宏得到一个 WORD类型的变量,该变量的低字节表示套接字规格的主要版本号,高字节表示套接字的次要版本号, MAKEWORD(2,2)表示套接字规格的版本号是 2.2MAKEWORD(1,2)则表示套接字规格的版本是 1.2;第二个参数保存了安装启用套接字时的信息。 WSAStartup()函数成功初始化动态库,则返回值为 0,否则为非 0

Create()函数中调用Init()函数

if( !InitSocket() )
{
   return false;
}

1.2 创建套接字

通过socket()函数创建套接字。该函数的格式是

SOCKET socket(int af, int type, int protocol);
其中,参数af是协议的地址族; type是协议的套接字类型; protocol指定了套接字使用的协议;如果成功创建了套接字,则函数返回值是创建的套接字,否则返回值是 INVALID_SOCKET

m_socket_listen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
AF_INET表示 IPv4地址族,包括 TCPUDPSOCK_STREAM表示套接字的类型是流套接字; IPPROTO_IP表示套接字使用 TCP协议; m_socket_listen是CTCPSocket_Server类private的成员变量,其类型为 SOCKET

SOCKET m_socket_listen;



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值