前言
网络上有许多关于socket传输文件、图片的文章,但是又许多服务,端客户端都在Linux平台上,而现实中,往往服务端是Linux系统,客户端是Windows系统,所以这次我实现了两个系统平台的文件传输,更符合实际,总之,一句话,socket原理都一样,流程都一样,接下来看代码:
一、客户端
说明:windows下的socket我已经进行了封装,我已经上传到我的资源,大家可以去下载winsocket的封装下载,另外,传输数据过程中,为保证数据的准确性,加入了CRC校验,crc校验的封装下载
#include<stdio.h>
#include<stdlib.h>
#include"CWinSocketClient.h"
#include"crc32.h"
#include<iostream>
using namespace std;
#define REQUEST_COVER 108 //请求封面
/*数据包头*/
typedef struct header_t
{
int type; //包类型
int size; //包大小,根据包大小读取包体数据
unsigned int crc; //报数据crc校验码
}HEADER_T;
/*客户端请求视频封面*/
typedef struct reqvdcover_t
{
int user_id; //用户id
char picture_name[32]; //图片名字
}REQVDCOVER_T;
/*服务器回应客户端封面*/
typedef struct ansclientcover_t
{
char pic_name[32]; //视频名字
int length; //每次发送长度
char buff[512]; //图片数据,
}ANSCLIENTCOVER_T;
int main(int argc, char** argv)
{
CWinSocketClient t;
t.start();
MyCrc32 *crc_check = new MyCrc32(); //定义一个32位的crc校验对象
crc_check->init_crc_table(); //初始化校验表
//输入向服务器请求的文件名称
char file_name[32];
memset(file_name,0, sizeof(file_name));
printf("Please Input File Name On Server.\n");
scanf("%s", file_name);
//自定义数据包包头
HEADER_T pichead;
memset(&pichead, 0, sizeof(HEADER_T));
pichead.type = REQUEST_COVER;
pichead.size = sizeof(REQVDCOVER_T);
//自定义数据包包体
REQVDCOVER_T picbody;
memset(&picbody, 0, sizeof(REQVDCOVER_T));
picbody.user_id = 2;
memcpy(picbody.picture_name, file_name, strlen(file_name)