用Socket 文件传输,传大文件时,接收的文件损坏,这是怎么回事呢?
我是一名刚开始学MFC的大学生,试着编了一个用socket传输文件的程序。
思路是把文件一次性读入缓冲区,然后用TCP发送,接收方一次性把文件接收入缓冲区,然后再写成文件。
我试着用这个程序传送了一些小的文本文件,一切正常,也传了一些MP3,正常。
但是在传送一些100多M的RMVB视频文件时,接收到的文件却无法打开
请问各位高手这是怎么回事呢?谢谢了。
该开始学,分不多,请见谅。
程序代码如下:
服务器端:
void CFileTransDlg::OnSend()
{
// TODO: Add your control notification handler code here
CFileDialog fd(true);
CString filename;
char fn[40];
SOCKET listenSocket;
SOCKET socketSend;
unsigned int listen_port;
CFile file;
int FileLength;
char *data;
struct sockaddr_in localaddr;
struct sockaddr_in clientaddr;
listen_port=5050;
int AddrSize;
AddrSize = sizeof(clientaddr);
if(IDOK == fd.DoModal())
{
filename = fd.GetFileName();
if(!file.Open(filename.GetBuffer(0),CFile::modeRead|CFile::typeBinary))
{
AfxMessageBox("打开文件错误,取消发送!");
return;
}
strcpy(fn,filename.GetBuffer(0));
}
else return;
listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
socketSend = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(listen_port);
if (bind(listenSocket, (struct sockaddr *)&localaddr,
sizeof(localaddr)) == SOCKET_ERROR)
{
AfxMessageBox("绑定socket失败 : %d\n", WSAGetLastError());
return ;
}
listen(listenSocket,20);
socketSend = accept(listenSocket,(struct sockaddr *)&clientaddr,&AddrSize);
FileLength = file.GetLength();
char acBuf[50] = { 0 };
sprintf(acBuf, "%d", FileLength);
send(socketSend,acBuf,50,0);
send(socketSend,fn,40,0);
data = new char[FileLength];
file.ReadHuge(data,FileLength);
send(socketSend,data,FileLength,0);
file.Close();
delete data;
closesocket(socketSend);
WSACleanup();
}
客户端:
void CFileTransClientDlg::OnReceive()
{
// TODO: Add your control notification handler code here
SOCKET socketReceive;
CFile file;
long FileLength = 0;
char tem[50];
char *data;
char fn[40];
struct sockaddr_in server;
unsigned int server_port=5050;
server.sin_family = AF_INET;
server.sin_port = htons(server_port);
server.sin_addr.s_addr = inet_addr("222.25.136.114");
InitWinsock();
socketReceive = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
connect(socketReceive,(struct sockaddr *)&server,sizeof(server));
recv(socketReceive,tem,50,0);
FileLength = chartoint(tem);
recv(socketReceive,fn,40,0);
data = new char[FileLength];
recv(socketReceive,data,FileLength,0);
file.Open(fn,CFile::modeCreate |CFile::modeWrite|CFile::typeBinary);
file.WriteHuge(data,FileLength);
file.Close();
delete data;
closesocket(socketReceive);
AfxMessageBox("接收文件成功!");
WSACleanup();
}