昨天我们我们了定义了一个网络库,但是只是给出了一些相关的信息,还没有真正的实现的,好吧,今天我们来说一下这个的类的实现,不过在
现在我们可以来实现的我们的相关class了,我们从简单的开始:
=======================================
//=====我们先从PER_IO_DATA着手吧=======
//构造函数,初始化相关对象
PER_IO_DATA::PER_IO_DATA(){
ReSet();
_socket = INVALID_SOCKET;
_op = ONIDEL_POSTED;
}
//析构函数,清楚断开socket
PER_IO_DATA::~PER_IO_DATA(){
if (_socket != INVALID_SOCKET){
closesocket(_socket);
_socket = INVALID_SOCKET;
}
}
//重置buffer,不过这个函数没用到,因为下面的ReSet更好一些
void PER_IO_DATA::ResetBuf(){
ZeroMemory(_buf, MAX_BUF);
}
//重置所有相关对象,除socket外
void PER_IO_DATA::ReSet(){
ZeroMemory(&
_ol, sizeof(WSAOVERLAPPED));
ZeroMemory(_buf, MAX_BUF);
_wsabuf.buf = _buf;
_wsabuf.len = MAX_BUF;
_op = ONIDEL_POSTED;
}
//其实这个也没用到,只是在完成例程中用到
MyNet* PER_IO_DATA::GetMyNet(){
return _pthis;
}
===================================
//现在我们再来看看PER_HANDLE_DATA的实现
PER_HANDLE_DATA::PER_HANDLE_DATA(){
_socket = INVALID_SOCKET;
memset(&
_addr, 0, sizeof(SOCKADDR_IN));
_Name = "
"
;
//保存连接客户的姓名
_Count = 0;
}
PER_HANDLE_DATA::~PER_HANDLE_DATA(){
if (_socket != INVALID_SOCKET){
closesocket(_socket);
_socket = INVALID_SOCKET;
}
}
//设置套接字
void PER_HANDLE_DATA::SetSocket(SOCKET _Sock){
_socket = _Sock;
}
//获取套接字
SOCKET&
PER_HANDLE_DATA::GetSocket(){
return _socket;
}
//设置客户地址
void PER_HANDLE_DATA::SetAddr(SOCKADDR_IN&
addr){
memcpy(&
_addr, &
addr, sizeof(SOCKADDR_IN));
}
//获取地址
SOCKADDR_IN&
PER_HANDLE_DATA::GetAddr(){
return _addr;
}
void PER_HANDLE_DATA::SetName(std::string name){
_Name = name;
}
//获取用户姓名
std::string&
PER_HANDLE_DATA::GetName(){
return _Name;
}
//原子操作将操作数+1
void PER_HANDLE_DATA::AddCount(){
InterlockedIncrement(&
_Count);
}
//原子操作将操作数-1
void PER_HANDLE_DATA::DecCount(){
InterlockedDecrement(&
_Count);
}
//获取目前的操作数
const unsigned long PER_HANDLE_DATA::GetCount() const{
return _Count;
}
//==================这章节就先说这里,余下的内容下面的章节再说
================================================
这两个class,开始的时候我直接打算就用PER_IO_DATA来操作的,但是后来发觉容易搞混,于是就重新封装一下,所以相信大家理解起来不会困难,好吧,下一讲我们开始来说说MyNet的实现。
================================
回复D&
d查看目录,回复相应的数字查看章节内容
原文始发于微信公众号(
C/C++的编程教室
):第八十七讲 综合运用(2)
|