CSocketClient

CSocketClient

前面已经实现了用于建立连接的CSocket对象和用于收发数据包的CPackage对象,CSocketClient是将上面提到的两个对象作为成员的一个对象,用于Client和Server之间通信,server端维护一个CSocketClient列表,每个进程维护一个单独的CSocketClient

服务端使用的构造函数

server通过accept()接受client的sock_fds, 就可以通过传入fd创建一个CSocketClient对象,server计划使用select监听所有client,所以设置为非阻塞模式

1
2
3
4
5
6
7
CSocketClient::CSocketClient(int sock_fd)
{
printf("sock_fd:%d\n", sock_fd);
mSocket = std::make_shared<CSocket>(sock_fd);
mSocket->setBlocking(false);
mPackage = std::make_shared<CPackage>(mSocket);
}

客户端使用的构造函数

client需要创建sockt_fd,所以传入的参数为需要创建的socket类型,以及阻塞模式,这里一般设置为阻塞模式,一直等待server的数据

1
2
3
4
5
6
7
8
CSocketClient::CSocketClient(int socket_type, bool blocking)
{
mSocket = std::make_shared<CSocket>();
mSocket->create(socket_type);
mSocket->setBlocking(blocking);
mPackage = std::make_shared<CPackage>(mSocket);
printf("sock_fd:%d\n", mSocket->getSocketFd());
}

获取CSocket对象

客户端需要获取CSocket对象,来进行connect,shutdown操作,直接返回即可:

1
2
3
4
std::shared_ptr<CSocket> CSocketClient::getSocket()
{
return mSocket;
}

发送数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int CSocketClient::sendData(const char *data, int data_length)
{
int ret = -1;

if (data == nullptr || data_length <= 0)
{
return ret;
}

if (mPackage)
{
ret = mPackage->sendDataPackage(data, data_length);
printf("sendData:%s, length:%d, ret:%d\n", data, data_length, ret);
}

return ret;
}

接收数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int CSocketClient::recvData(char **data, int *data_length)
{
int ret = -1;

if (data == nullptr || data_length == nullptr)
{
return ret;
}

if (mPackage)
{
ret = mPackage->recvDataPackage(data, data_length);
}

return ret;
}

CSocketClient
https://carl-5535.github.io/2022/11/14/CarlSDK/CSocketClient/
作者
Carl Chen
发布于
2022年11月14日
许可协议