客户端----发送方
先导入WSAStartup函数的一个声明
//获取文件大小
struct stat s
这个结构体包含了文件的基本信息,例如大小、所有者、权限、最后访问和修改时间等。
//发送信息给服务器
char*ptemp=szbuf;
while(*++ptemp!='\0');
while(*--ptemp!='\\');
++ptemp;
ptemp就提取了文件路径中的文件名
strcpy(fh.m_szFileName,ptemp);//把文件名复制给m_szFileName
send(sockclient,(char*)&fh,sizeof(fh),0);//并发送给接收方
//接收服务器的回复
int num=recv(sockclient,szResult,sizeof(szbuf),0);//使用 recv
函数来接收通过套接字 sockclient
发来的数据。recv
函数接收数据到 szResult
数组中,sizeof(szbuf)
指定了接收数据的最大字节数,用 szbuf
的大小作为接收的大小,
//读文件并发送
int nReadNum=fread(szContent,sizeof(char),ONEPAGE,pfile);
//使用 fread
函数从文件流 pfile
中读取数据。fread
函数将读取的数据存储在 szContent
数组中。sizeof(char)
是每个字符占用的字节数,ONEPAGE
是要读取的字符数,定义了读取数据的块大小。nReadNum
变量存储了实际读取到的字符数。
if(nReadNum>0)
{
send(sockclient,szContent,nReadNum,0);
// 如果读取成功,会使用 send
函数将读取的数据通过套接字 sockclient
发送给客户端,szContent
是要发送的数据,nReadNum
是发送数据的字节数
}
//文件关闭
fclose(pfile);
服务器----接收方
//接收文件信息
recv(sockWaiter,(char*)&fh,sizeof(fh),0);
//yes or no
char szResult[RESULT]={0};
char szContent[ONEPAGE]={0};
cin>>szResult;//输入回复yes
//发送给客户端
send(sockWaiter,szResult,sizeof(szResult),0);
//yes
//指定存储路径
char szpath[MAX_PATH]={0};
cin>>szpath;
strcat(szpath,fh.m_szFileName);//从用户接收一个路径szpath,然后将文件名 fh.m_szFileName
连接到该路径的末尾,从而构建一个完整的文件路径
//在指定位置创建文件
FILE *pfile=fopen(szpath,"wb");//fopen
函数以二进制写模式打开一个文件
//接收文件内容
int nReadNum=recv(sockWaiter,szContent,sizeof(szContent),0);//接收szContent里面的内容
if(nReadNum>0)
{
fwrite(szContent,sizeof(char),nReadNum,pfile);
noffset+=nReadNum;
cout<<"recv file:"<<noffset*100/fh.FileSize<<endl;
if(noffset==fh.FileSize){
break;
}
}
//读取成功,这行代码使用 fwrite
函数将读取到的数据从 szContent
缓冲区写入到由 pfile
指向的文件中。sizeof(char)
是每个字符的字节大小,nReadNum
是要写入的字符数
//fwrite
函数将确保数据被完整地写入文件,即使数据量超过了缓冲区的大小,也会正确处理
//关闭文件
fclose(pfile);
标签:szContent,pfile,TCP,char,nReadNum,fh,服务器,sizeof,客户端 From: https://blog.csdn.net/weixin_74265856/article/details/141000270