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