(11)TCP通信框架:客户端和服务端设计

TCP通信框架:客户端和服务端设计

TCP通信框架设计

  • 客户端
    – 以协议消息为基本单位收发数据;
    – 同时支持字节为单位收发数据;
  • 服务端
    – 负责监听连接,并产生通信客户端;
    – 负责监听数据通信状态,并给出通知;

职责定义

  • 客户端用于进行实际的双向通信
    – 数据接收和发送(协议消息);
  • 服务端仅用于监听和回调通知
    – 事件类型:连接、数据、断开;
    – 事件回调:void (* Listener)(TcpClient* client, int event);

客户端接口设计

typedef void TcpClient;

/* 用于创建TcpClient通信实体 */
TcpClient* TcpClient_Nrw();	// 凭空创建TcpClient(堆空间)
TcpClient* TcpClient_From(int fd);//从已有的Socket中创建TcpClient

/* 数据收发 */ 
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;//socket文件描述符
	MParser* parser;//每个TcpClient都有自己的解析器
	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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值