TLV数据传输实例

本文详细介绍了TLV(Type-Length-Value)数据传输格式,通过提供服务器和客户端的实例代码,展示了如何在实际通信中使用TLV进行数据打包和解析,帮助理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TLV头文件

#ifndef __TLV_H__
#define __TLV_H__

//发送命令的类型(获取文件列表还是指定文件)
enum type_t{
	FLIST = 0,
	FGET
};

enum send_status_t{
	SEND_FHEAD = 1,
	SEND_FBODY,
	SEND_FOVER
};

//发送数据的命令头结构
typedef struct{
	unsigned char type;
	unsigned long len;
}cmd_head_t;

//发送的文件头部信息
typedef struct{
	char fname[256];
	unsigned long flen;
}file_head_t;

enum is_start_t{
	START = 0,
	STOP
};

typedef struct 
{
	int sock_fd;
	int file_fd;
	int is_start;
	int send_status;
}client_info_t;


#endif

服务器示例

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "tlv.h"

#define MAX_SIZE 512


int send_data(int sockfd, char *data, int len)
{
	int recv_len = 0;
	int total_len = 0;
	while (total_len < len){
		recv_len = send(sockfd, data + total_len, len - total_len, 0);
		if (recv_len < 0){
			if (errno == EAGAIN || errno == EINTR){
				usleep(1000);
				continue;
			}
			return -1;
		}
		total_len += recv_len;
	}
	return 0;
}

int recv_data(int sockfd, char *data, int len)
{
	int count = 0;
	int recv_len = 0;
	while (recv_len < len){
		recv_len = recv(sockfd, data, len, 0);
		if (errno == EAGAIN || errno == EINTR){
			if (count++ > 5){
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值