65,186
社区成员




//...客户端代码
int block=0;
char temp[100];
char buffer[1056];
while (true)
{
ZeroMemory(temp,sizeof(temp));
sprintf(temp,"Range:bytes=%d-%d\r\n",block*900,(block+1)*900);
ZeroMemory(buffer,sizeof(buffer));
strcpy(buffer,"Get 金莎-平行线.mp3\r\n");
strcpy(buffer+strlen(buffer),temp);
if (send(client,buffer,strlen(buffer),0)==SOCKET_ERROR)
{
printf("send error:%d\r\n",GetLastError());
};
Sleep(100);
ZeroMemory(buffer,sizeof(buffer));
int recvcount=recv(client,buffer,sizeof(buffer),NULL);
printf("recvcount=%d\r\n",recvcount);
char* pbegin=strstr(buffer,"PPVOD:200 OK\r\n");
if (pbegin!=NULL)
{
pbegin+=strlen("PPVOD:200 OK\r\n");
FILE *file=NULL;
file=fopen("金莎-平行线.mp3","abr");
// fseek(file,0,SEEK_END);
char *pend=strstr(buffer,"Server:File End\r\n");
if (pend!=NULL)
{
int number=fwrite(pbegin,sizeof(char),pend-pbegin,file);
printf("number=%d\r\n",number);
fflush(file);
fclose(file);
break;
}
pend=NULL;
pend=strstr(pbegin,"Server:Current\r\n");
if (pend!=NULL)
{
int number=fwrite(pbegin,sizeof(char),pend-pbegin,file);
printf("number=%d\r\n",number);
fflush(file);
fclose(file);
}
fclose(file);
}
++block;
}
//服务器端部分代码
//Parse the message which comes from client ,and set response message to client
int ParseMessage(char *szbuffer,char *response)
{//szbuffer为从客户端收到的消息,response准备send给客户端的内容
int len=0;
char filename[MAX_PATH];
ZeroMemory(filename,sizeof(filename));
char *pbegin=strstr(szbuffer,"Get ");
pbegin+=strlen("Get ");
char *pend=strstr(szbuffer,"\r\n");
strncpy(filename,pbegin,pend-pbegin);
FILE *file=NULL;
int startpos=0;
int endpos=0;
if ( ( file=fopen(filename,"rb") )==NULL )
{
strcpy(response,"PPVOD:204\r\n");//未找到文件
strcpy(response+strlen(response),"Server:No Find File\r\n");
len=strlen(response);
return len;
}
else
{
pbegin=strstr(szbuffer,"Range:bytes=");
int result=sscanf(pbegin,"Range:bytes=%d-%d\r\n",&startpos,&endpos);
if (result!=2 || startpos>=endpos)
{
strcpy(response,"PPVOD:205\r\n");//格式错误
strcpy(response+strlen(response),"Server:Range Error\r\n");
fclose(file);
len=strlen(response);
return len;
}
result=fseek(file,startpos,SEEK_SET);
if (result)
{
strcpy(response,"PPVOD:206\r\n");//块头超出文件
strcpy(response+strlen(response),"Server:Range Error\r\n");
cout<<response<<endl;
fclose(file);
len=strlen(response);
return len;
}
else
{
strcpy(response,"PPVOD:200 OK\r\n");
}
len=strlen(response);
int number=fread(response+len,sizeof(char),endpos-startpos,file);
if (number<endpos-startpos)
{
len+=number;
strcpy(response+len,"Server:File End\r\n");//文件结束
len+=strlen("Server:File End\r\n");
}
else
{
len+=number;
strcpy(response+len,"Server:Current\r\n");//
len+=strlen("Server:Current\r\n");
}
fclose(file);
return len;
}
}
strstr(pbegin,"Server:Current\r\n");
等类似strstr查找文件数据的起点位置和结束位置。再fwrite(pbegin,sizeof(char),pend-pbegin,file);
写入硬盘文件
int number=fread(response+len,sizeof(char),endpos-startpos,file);//这里是没错的number返回900
if (number<endpos-startpos)
{
len+=number;
strcpy(response+len,"Server:File End\r\n");//文件结束
len+=strlen("Server:File End\r\n");
}
else
{
len+=number;
strcpy(response+len,"Server:Current\r\n");//到了这里就是拷贝不进"Server:Current\r\n");若是对文本txt文件操作的话就可以拷贝进去
len+=strlen("Server:Current\r\n");
}