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){