TCP通信框架:客户端和服务端设计
TCP通信框架设计
- 客户端:
– 以协议消息为基本单位收发数据;
– 同时支持字节为单位收发数据; - 服务端:
– 负责监听连接,并产生通信客户端;
– 负责监听数据通信状态,并给出通知;
职责定义
- 客户端用于进行实际的双向通信:
– 数据接收和发送(协议消息); - 服务端仅用于监听和回调通知:
– 事件类型:连接、数据、断开;
– 事件回调:void (* Listener)(TcpClient* client, int event);
客户端接口设计
typedef void TcpClient;
TcpClient* TcpClient_Nrw();
TcpClient* TcpClient_From(int fd);
int TcpClient_SendMsg(TcpClient* client, Message* msg);
int TcpClient_SendRaw(TcpClient* client, char* buf, int length);
Message* TcpClient_RecvMsg(TcpClient* client);
int TcpClient_RecvRaw(TcpClient* client, char* buf, int length);
int TcpClient_Connect(TcpClient* client, char* ip, int port);
int TcpClient_IsValid(TcpClient* client);
void TcpClient_Close(TcpClient* client);
void TcpClient_Del(TcpClient* client);
void TcpClient_SetData(TcpClient* client, void* data);
void* TcpClient_GetData(TcpClient* client);
客户端代码关键实现
typedef struct tcp_client
{
int fd;
MParser* parser;
void* data;
}Client;
TcpClient* TcpClient_New(){
return TcpClient_From(-1);
}
TcpClient* TcpClient_From(int fd)
{
Clinet* ret = malloc(sizeof(Client));
if( ret ){
ret->fd = fd;
ret->parser = MParser_New();
ret->data = NULL;
}
return (ret && ret->parser) ? ret : (free(ret),NULL);
}
int TcpClient_SendMsg(TcpClient* client, Message* msg)
{
int ret = 0;
Client* c = (Clinet*)client;
if(c && msg)
{
int len = Message_Size(msg);
char* data = (char*)Message_H2N(msg);
ret = (send(c->fd, data, len, 0) != -1);
Message_N2H(msg);
}
return ret;
}