fread 读取mp3文件并网络发送出去

sms88 2008-02-26 04:16:15
这些代码对txt文件是没有问题的,而要传送mp3文件时却客户端部分pend=strstr(pbegin,"Server:Current\r\n");永远返回NULL,使得无法读取出mp3文件的数据
我觉得是mp3里有些特殊字符的原因

//...客户端代码
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;
}

}
...全文
138 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Supper_Jerry 2008-02-27
  • 打赏
  • 举报
回复
//到了这里就是拷贝不进"Server:Current\r\n");
response会不会内存不够了?进入这个else的时候number正确吗?
sms88 2008-02-27
  • 打赏
  • 举报
回复
服务器向客户端发送这样的格式消息:
PPVOD:200 OK\r\n
//900大小的文件数据
Server:Current\r\n 或者Server:File End\r\n

客户端就使用
strstr(pbegin,"Server:Current\r\n");
等类似strstr查找文件数据的起点位置和结束位置。再
fwrite(pbegin,sizeof(char),pend-pbegin,file);
写入硬盘文件
sms88 2008-02-27
  • 打赏
  • 举报
回复
我希望服务器端每次读取900大小的数据

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");
}

Supper_Jerry 2008-02-27
  • 打赏
  • 举报
回复
pend=strstr(pbegin,"Server:Current\r\n");
这句话本身没有问题的。很可能pbegin里面就没有后面的字符串。
sms88 2008-02-27
  • 打赏
  • 举报
回复
up
sms88 2008-02-27
  • 打赏
  • 举报
回复
原来发现mp3文件里有终止符'\0'
搞得strstr走到'\0'就会退出
zh1369 2008-02-27
  • 打赏
  • 举报
回复
mp3 != txt
sms88 2008-02-27
  • 打赏
  • 举报
回复
内存空间是够的,当number小于900时(既到了文件的尾端了)就会进入
if (number<endpos-startpos)
{
len+=number;
strcpy(response+len,"Server:File End\r\n");//文件结束

len+=strlen("Server:File End\r\n");
}
SoftBomb 2008-02-26
  • 打赏
  • 举报
回复
pend=strstr(pbegin,"Server:Current\r\n");

很可能是遇到0,提前结束查找了
可以使用strlen(pbegin)来验证看看

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧