我写了一个文件传输的程序,基于tcp,发送一般的文本文件没有问题,但是发送二进制文件却有问题,我是基于二进制文件发送的,发送端没有问题,主要是接收的问题,接收的数据中间所有'\0'字节都丢失了,请问大家是如何搞定的。/////////////////////////////////////////////////////////////////////
char msg[BYTEMAXLEN];f=fopen(filename,"rb");
while (f!=NULL && !feof(f)) //发送
{
l=fread((void*)msg,1,BYTEMAXLEN,f);
if (l!=BYTEMAXLEN) msg[l]='\0';
send(client,msg,strlen(msg),0);
}
send(client,"^&*",3,0);
fclose(f);
/////////////////////////////////////////////////////////////////////f=fopen(filename,"wb");
while (true) //接收
{
strcpy(msg,"");
l=recv(client,msg,BYTEMAXLEN,0);
if (msg[l-3]=='^' && msg[l-2]=='&' && msg[l-1]=='*') //发送完的标志 
{
msg[l-3]='\0';
fwrite((void*)msg,1,l-3,f); //写入数据
break;
}
fwrite((void*)msg,1,l,f);
}
fclose(f);
//////////////////////////////////////////////////////////////////

解决方案 »

  1.   

    send(client,msg,strlen(msg),0);不对。文本文件只有在结束才有\0,所以没问题。别的类型的文件不是字符串类型,什么地方都可能有\0,而你那句只发送了从开始到第一个\0的数据出去。把strlen(msg)改成你读出来的真实长度(你这里就是l吧)。
      

  2.   

    刚说的有一点没对,你那个循环可以保证从头发到尾。但是注意那个strlen(msg),它返回的是不包含最后那个\0的长度,但你读文件的指针已经到那个\0后面去了。所以所有的\0都被吃掉了。
      

  3.   

    l=fread((void*)msg,1,BYTEMAXLEN,f);根据l这个值吧.把strlen换了.
    奇怪了.fread第一个参数不是char *吗?
    另外.你发送完数据也可以直接关掉connect,然后客户端也可以得到关闭这个消息的.
      

  4.   

    lsgt() 没有说错,我的strlen()确实用错了,谢谢,我试试看行不行。
      

  5.   

    你接收端的判断结束的逻辑有问题!判断接收到的数据是否>0决定是否继续fwrite。
    msg[l-3]='\0';这里有问题!!
      

  6.   

    上楼兄台错误,最后三个字符是我的文件传输结束标志,不能写入到文件中。感谢帮忙,已搞定,确实是 strlen() 用错。