,我做了一个Tcp/ip文件传输程序,开了十个线程。传输小文件可以正确传输,大文件服务器就出错。是不是传输大文件还要加上什么东西
server端
while(i<10)
         {       
         sockSrvr.Accept(pSockConnection[i]);
AfxBeginThread(SendThread,&param[i]);
i++;
}
UINT SendThread(LPVOID pParam)
{
FILEINFO fileinfo;
Param *pFileInfo=(Param*)pParam;
int fileLen=pFileInfo->filelen;
CSocket *pSockconnection=pFileInfo->pSockcon;
int seek=pFileInfo->seek;
int totalLen=pFileInfo->totalLen;
int cbLeftToSend=pFileInfo->filelen,readLen = 0;
fileLen=htonl(fileLen);
fileinfo.fileLen=fileLen;
fileinfo.seek=htonl(seek);
fileinfo.totalLen=htonl(totalLen);
pSockconnection->Send(&fileinfo,sizeof(FILEINFO));

TRACE("Thread : %d-The File Seek :%d-File Length :%d\r\n",hThread++, seek, pFileInfo->filelen); sendFile.Seek(seek,CFile::begin); BYTE buffer[4096];
int SendSucc=0;
int count=0;//test
while (TRUE)
{
 

if (cbLeftToSend >= 4096)
{
readLen = sendFile.Read(buffer,4096);
SendSucc=pSockconnection->Send(buffer,readLen);
cbLeftToSend -=readLen;
}
else
{
readLen = sendFile.Read(buffer,cbLeftToSend);
SendSucc=pSockconnection->Send(buffer,readLen);

break;
} if ( SendSucc == SOCKET_ERROR )
break;
}

return 0;
}

解决方案 »

  1.   

    谢谢peterxuxu(peterxuxu) 
    如果发送出错,我break了啊
    但是程序说出现异常
    是不是也要做异常处理啊
    还有如果发送有错,可以重复发送吗
      

  2.   

    socket发送 是有数据大小限制的。默认大小我记不清楚了。你需要设置一下。需要把大文件分割成很多数据包然后发送。
      

  3.   

    to star119119
    我已经设了 最大也就4096
    应该不存在你说的哪个问题吧
      

  4.   

    readLen = sendFile.Read(buffer,4096);你是指这个么?不是这个。我说的是设置读取缓冲区大小。是设置socket的,不是你用来存储数据的缓冲区大小。CAsyncSocket::SetSockOpt去msdn查一查
      

  5.   

    谢谢star119119
    我现在虽然不出现哪个异常问题了
    可有的线程起不来
    不知道怎么回事
    传输过去的文件也会莫名其妙的变的好大
    希望知道的能告诉我一下
    还有怎么进行差错检测啊,能否给我一个思路
    谢谢了啊
      

  6.   

    你可以看看ftp协议是怎么在做的,不太明白你为什么硬是要自己写,利用ftp协议做要好得多
      

  7.   

    谢谢peterxuxu(peterxuxu) 
    这是我第一次写这种程序,都不知道要参考那些资料
    谢谢你啊
    我现在就去看看ftp协议
      

  8.   

    你得这个程序就是普通的tcp/ip程序。我也想不出来为什么你得到的数据为什么会变大。可能是你在接收的时候是直接把
    recv里面的buffer给写入文件了把。
    这个不能这么写。要用recv的返回值作为数据长度,然后从buffer里面截取这么长写入文件。这才是socket接收到的真实数据。我以前写的文件传输就是这么做的。没有问题。对于你这个程序最好是自己debug跟踪以下。看看接收端和发送端传输的数据是否一致。然后就知道原因了。
      

  9.   

    to:star119119
    while (fileLen>0)
    {
    receiveLen=sockClient.Receive(buffer,4096);
    if ( receiveLen!=SOCKET_ERROR)
    {
    recvFile.Write(buffer,receiveLen);
    fileLen-=receiveLen;
    int i=recvFile.GetLength();
    }
    else
    {
    MessageBox(NULL,"接受数据出错","警告",MB_ICONWARNING);
    break;
    }
    }
    这是我接受端的程序,不存在你说的哪个问题啊
    我这个是多线程的,他是每有一个线程退出来,就会变大一点,好象是这样的
    你不介意的话,告诉我你的email,我把源码给你看看
      

  10.   

    to:star119119
    以前你写的程序,可否借我看一下
    谢谢了啊
      

  11.   

    我的程序在单位,签了保密协议这个东西网络上有很多demo。www.vckbase.com
    www.codeproject.com这两个是我常上的。
      

  12.   

    不太清楚,你接收端和发送端的完整代码,但是提示你的是,你可以增加一个定长的数据头例如:
    可以这么定义一个定长的段,
    包字段名意义  类型
    数据包总长度   int
    传送的指令     int64
    序列号          int