HANDLE filehandle=CreateFile("XXXXXXX",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(filehandle==INVALID_HANDLE_VALUE)
return 0;
    DWORD filesize=GetFileSize(filehandle,NULL);
DWORD readsize=0;
buff=new char[4096+1];
while(TRUE)
{
SetFilePointer(filehandle,readsize,NULL,FILE_CURRENT);
if(!ReadFile(filehandle,buff,4096,&readsize,NULL))
return 0;
    send(file_socket,buff,readsize,0);
if(readsize<4096)
break;
}
delete buff;
CloseHandle(filehandle);
closesocket(file_socket);代码运行很正常  并且 传送文本文件没问题
但是传送2进制 文件就有问题了。
高手指点一下。。

高手帮忙看看 100

解决方案 »

  1.   

    调用send要判断返回值的。另外接收方调用recv更要判断返回值。
      

  2.   

    send都是次要的
    我要问的主要是  setfilepointer 和  readFile 2个函数啊 
    我想达到的目的是 每次读取 4KB 然后 移动 读取指针。。
    如果读的 字节小于4kb那就证明 文件读完了。上面的代码对吗
      

  3.   

    SetFilePointer是多余的,直接从头开始连续Read就可以。
      

  4.   

    LZ太相信recv\read\write等函数,理想情况下是你需要的长度,不过现实都不太理想,判断返回值.
      

  5.   

    SetFilePointer是多余的,直接从头开始连续Read就可以。
    楼主的程序有内存泄露!
    HANDLE filehandle=CreateFile("XXXXXXX",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
    if(filehandle==INVALID_HANDLE_VALUE) 
    return 0; 
        DWORD filesize=GetFileSize(filehandle,NULL); 
    DWORD readsize=0; 
    buff=new char[4096+1]; 
    while(TRUE) 

    SetFilePointer(filehandle,readsize,NULL,FILE_CURRENT); 
    if(!ReadFile(filehandle,buff,4096,&readsize,NULL)) // 当这里成立的时候,直接返回,不会释放内存
    return 0; 
        send(file_socket,buff,readsize,0); 
    if(readsize <4096) 
    break; 

    delete buff; 
    CloseHandle(filehandle); 
    closesocket(file_socket); 
      

  6.   

    不知道我说的对不对,你既然读取的同时,指针也在往后移动,那么你第二次进来的时候,那么ReadSize已经不为0了,这时候,你又移动了一次指针啊。相当于移动了两次,所以大于4K的文件都会出错......HANDLE filehandle=CreateFile("XXXXXXX",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
    if(filehandle==INVALID_HANDLE_VALUE)
    {
    return 0;
    }
    DWORD filesize=GetFileSize(filehandle,NULL); 
    DWORD readsize=0; 
    buff=new char[4096+1]; 
    while(ReadFile(filehandle,buff,4096,&readsize,NULL)) //直接循环读取,指针自动会一次后移
    {
    if(readsize > 0)
    {
    send(file_socket,buff,readsize,0);//先发送
    }
    if(readsize != 4096) //然后判断是否已经到了文件的末尾了

    break; 

    }
    delete buff; 
    CloseHandle(filehandle); 
    closesocket(file_socket);