69,382
社区成员
发帖
与我相关
我的任务
分享
DWORD WINAPI RecvFile(LPVOID IpParam)
{
int nStatus;
unsigned long cmd;
SOCKET socket_recvFile;
socket_recvFile = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
nStatus = ioctlsocket(socket_recvFile,FIONBIO,&cmd); //非阻塞模式
SOCKADDR_IN addrrcl;
addrrcl.sin_family = AF_INET;
addrrcl.sin_port = htons(5000);
addrrcl.sin_addr.s_addr = inet_addr("127.0.0.1");
bind(socket_recvFile,(SOCKADDR*)&addrrcl,sizeof(SOCKADDR));
int len = sizeof(sockaddr);
timeval tv;
while(1)
{
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(socket_recvFile,&fdread);
tv.tv_sec = 0;
tv.tv_usec=1000;
select(0,&fdread,NULL,NULL,&tv);
if(FD_ISSET(socket_recvFile,&fdread))
{
SendFile_Req sendFile_Req;
SendFile_Req *q = &sendFile_Req;
recvfrom(socket_recvFile, (char *)q, sizeof(SendFile_Req),0,(SOCKADDR*)&addrrcl,&len);
printf("即将收到文件\n");
printf("将要收到包数:%d\n",q->PackageNum); //包数在下面用作循环结束条件
Assemble *head;
head = Create_LinkList(q->PackageNum);
int i;
int k = 0;
while(1)
{
FilePackage file_package;
FilePackage *p1 = &file_package;
recvfrom(socket_recvFile, (char *)p1, sizeof(FilePackage),0,(SOCKADDR*)&addrrcl,&len);
printf("接收到的包的序列号=%d\n",p1->seq);
/组装成带指针的结构体,下一步建成链表
Assemble assemble;
Assemble *p2 = &assemble;
p2 = (Assemble *)malloc(sizeof(Assemble));
memcpy(p2->recv.content,p1->content,60*1024);
strcpy(p2->recv._Filename, p1->_Filename);
Delete_LinkList(head, p1->seq);
Insert_LinkList(head, p2, p1->seq);
k++;
if ( k == q->PackageNum )
break;
}
//接收完毕,写入文件
Assemble Afile_package;
Assemble *p3 = &Afile_package;
char Location[1000] = "D:\\文件传输下载1\\";
p3 = head->next;
strcat(Location, p3->recv._Filename);
FILE *fp = fopen (Location, "wb");
rewind(fp);
int j;
for(i=1; i<=q->PackageNum; i++)
{
if ( i == sendFile_Req.PackageNum)
j = sendFile_Req.PackageSize%(60*1024);
else
j = 60*1024;
fwrite(p3->recv.content,sizeof(char),j,fp);
p3 = p3->next;
}
fclose(fp);
printf("\n\n**********接收文件成功**********\n\n");
}
else
Sleep(1000);
}
closesocket(socket_recvFile);
WSACleanup();
printf("exit\n");
}