,我做了一个Tcp/ip文件传输程序,开了十个线程。传输小文件可以正确传输,大文件服务器就出错。是不是传输大文件还要加上什么东西
server端
while(i<10)
{
sockSrvr.Accept(pSockConnection[i]);
AfxBeginThread(SendThread,¶m[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;
}
server端
while(i<10)
{
sockSrvr.Accept(pSockConnection[i]);
AfxBeginThread(SendThread,¶m[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;
}
如果发送出错,我break了啊
但是程序说出现异常
是不是也要做异常处理啊
还有如果发送有错,可以重复发送吗
我已经设了 最大也就4096
应该不存在你说的哪个问题吧
我现在虽然不出现哪个异常问题了
可有的线程起不来
不知道怎么回事
传输过去的文件也会莫名其妙的变的好大
希望知道的能告诉我一下
还有怎么进行差错检测啊,能否给我一个思路
谢谢了啊
这是我第一次写这种程序,都不知道要参考那些资料
谢谢你啊
我现在就去看看ftp协议
recv里面的buffer给写入文件了把。
这个不能这么写。要用recv的返回值作为数据长度,然后从buffer里面截取这么长写入文件。这才是socket接收到的真实数据。我以前写的文件传输就是这么做的。没有问题。对于你这个程序最好是自己debug跟踪以下。看看接收端和发送端传输的数据是否一致。然后就知道原因了。
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,我把源码给你看看
以前你写的程序,可否借我看一下
谢谢了啊
www.codeproject.com这两个是我常上的。
可以这么定义一个定长的段,
包字段名意义 类型
数据包总长度 int
传送的指令 int64
序列号 int