socket 大文件传输丢失数据
最近刚接触socket编程,使用TCP协议,阻塞式的socket点对点传输文件。当服务器和客户端都运行在一台电脑上,多大的文件都没问题(我最大试过700多兆的),但是把客户端放到另一个电脑上运行时,稍微大一点的文件只能传5K左右,也没有任何异常,求高手帮忙解答一下,问题可能出在哪里
服务器端程序:
void CPPServerDlg::OnBtnsendfile()
{
// TODO: Add your control notification handler code here
UpdateData(true);
CFile myFile;
if(!myFile.Open(m_filename, CFile::modeRead | CFile::typeBinary))
{
AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
return;
}
SOCKET_STREAM_FILE_INFO StreamFileInfo;
WIN32_FIND_DATA FindFileData; //记载当前文件的基本信息
FindClose(FindFirstFile(m_filename,&FindFileData)); //把文件信息放在了FindFileData
memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());
StreamFileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
StreamFileInfo.ftCreationTime = FindFileData.ftCreationTime;
StreamFileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
StreamFileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
StreamFileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;
StreamFileInfo.nFileSizeLow = FindFileData.nFileSizeLow;
//发送文件基本信息
send(g_hAcceptSocket,(const char *)&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO),0);
UINT dwRead=0;
UINT dw=0;
byte* data = new byte[1024];
int ret=0;
while(true)
{
dw=myFile.Read(data,1024);
if (dw<1024)
{
if ((send(g_hAcceptSocket,(char*)data,dw,0))==SOCKET_ERROR)
{
AfxMessageBox("发送文件失败!");
}
break;
}
ret=send(g_hAcceptSocket,(const char*)data,1024,0);
if (ret==0)
{
break;
}
if (ret==SOCKET_ERROR)
{
break;
}
}
myFile.Close();
delete []data;
AfxMessageBox("发送完毕!");
}
客户端程序:
UINT dwRecv = 0;
byte* data = new byte[1024];
while(TRUE)
{
memset(data,0,1024);
dwRecv=recv(m_hSocket,(char*)data,1024,0);
if (dwRecv<1024)
{
destFile.Write(data,dwRecv);
break;
}
if (dwRecv==0)
{
break;
}
else if (dwRecv==SOCKET_ERROR)
{
break;
}
destFile.Write(data,dwRecv);
}
SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
&StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
destFile.Close();
delete []data;
SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
closesocket(m_hSocket);
AfxMessageBox("接收完毕!");
连接部分的代码省略