📄 transfer.h
字号:
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib,"Ws2_32")
#include <mmsystem.h>
#include <windows.h>
#pragma comment(lib,"Winmm.lib")
//接收文件模式
void RecvFile(char FileName[MAX_PATH], SOCKET s)
{
HANDLE hf=CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
char buf[1024];
char Flag[3]="w";
memset(buf,0,1024);
DWORD Read=0,Write=0;
while(1)
{
Read=recv(s,buf,1024,0);
if(Read<=0)
{
MessageBox(NULL,"接收文件失败","",MB_OK);
break;
}
if(buf[0]=='E'&&buf[1]=='N'&&buf[2]=='D')
{
MessageBox(NULL,"文件传输完成","",MB_OK);
CloseHandle(hf);
send(s,Flag,1,0);
return;
}
if(!WriteFile(hf,buf,Read,&Write,NULL))
{
MessageBox(NULL,"写入文件失败","",MB_OK);
return;
}
send(s,Flag,1,0);
}
}
void SendFile(char filename[MAX_PATH],SOCKET s)
{
char buf[1024];
memset(buf,0,1024);
DWORD Read;
HANDLE hf=NULL;
hf=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if(!hf)
{
MessageBox(NULL,"打开文件失败","",MB_OK);
send(s,"END",strlen("END"),0);
return;
}
ReadFile(hf,buf,1024,&Read,NULL);
while(Read)
{
int real;
timeval tv;
fd_set fs;
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&fs);
FD_SET(s, &fs);
select(0, NULL, &fs, NULL, &tv);
send(s,buf,Read,0);
//接收同步标志超时设置
FD_ZERO(&fs);
FD_SET(s, &fs);
select(0, &fs, NULL, NULL, &tv);
memset(buf, 0, sizeof(buf) );
real = recv(s, buf, 1, 0);
if(real<0)
break;
ReadFile(hf,buf,1024,&Read,NULL);//循环读文件并发送,读完之后接收标志位,
//收到标志位后再继续循环,循环控制为读到的字节数,当文件读完后Read=0,循环结束。
}
send(s,"END",strlen("END"),0);
CloseHandle(hf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -