tcp传输大文件问题

_李小白
优质创作者: 操作系统技术领域
2013-12-26 10:46:13
今天自己编写了一个tcp传输文件的程序,用小文件和图片试了,都正常,当传输大文件时,程序就莫名死掉了,求大神解答。
接收端代码如下:

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
if(sockSrv==INVALID_SOCKET)
{
cout<<"Failed socket"<<endl;
return 0;
}
//do not bind .. dynamic
SOCKADDR_IN addrSvr;
addrSvr.sin_family=AF_INET;
addrSvr.sin_port=htons(8001);
addrSvr.sin_addr.S_un.S_addr=inet_addr(ip);

if(connect(sockSrv,(SOCKADDR*)&addrSvr,sizeof(addrSvr))==-1)
{
cout<<"tcp连接失败!!"<<endl;
return 0;
}

//receive
char buff[200];
char filename[256];
int nRecv=-1;

memset(filename,0,sizeof(filename));
nRecv=recv(sockSrv,filename,sizeof(filename),0);

cout<<"接收文件:"<<filename<<endl;

FILE * fp;
fp=fopen(filename,"wb");
if(fp==NULL)
{
cout<<"创建文件失败"<<endl;
return 0;
}

while(1)
{
memset(buff,0,sizeof(buff));
nRecv = -1;
nRecv=recv(sockSrv,buff,sizeof(buff)-1,0);

if(nRecv <= 0)
break;
cout<<buff<<endl;;
fwrite(buff,nRecv,1,fp);


}
cout<<"接收完成!!"<<endl;

fclose(fp);
closesocket(sockSrv);

发送端代码如下:

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
if(sockSrv==INVALID_SOCKET)
{
cout<<"Failed socket"<<endl;
return 0;
}
//do not bind .. dynamic
SOCKADDR_IN addrSvr,addrClient;
int len=sizeof(addrClient);
addrSvr.sin_family=AF_INET;
addrSvr.sin_port=htons(8001);
addrSvr.sin_addr.S_un.S_addr=INADDR_ANY;
// 绑定IP和端口
if ( bind(sockSrv, (sockaddr*)&addrSvr, sizeof(addrSvr)) == SOCKET_ERROR)
{
cout << "tcp绑定IP和端口失败!"<<endl;
return 0;
}

if (listen(sockSrv, 1) == SOCKET_ERROR)
{
cout << "tcp监听端口失败!" << endl;
return 0;
}

//receive
char buff[200];
char filename[256];
int nRead;
SOCKET sockConn;

cin>>filename;

sockConn = accept(sockSrv,(SOCKADDR*)&addrClient, &len);

int err=send(sockConn,filename,strlen(filename),0);
cout<<err<<endl;

FILE * fp;
fp=fopen(filename,"rb");

while(1)
{
if(feof(fp))
break;
nRead = -1;
memset(buff,0,sizeof(buff));
nRead=fread(buff,1,sizeof(buff)-1,fp);

cout<<buff<<endl;
nRead=send(sockConn,buff,nRead,0);

}

cout<<"发送完成!!"<<endl;
fclose(fp);
closesocket(sockConn);
closesocket(sockSrv);
...全文
473 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bailian4399 2013-12-30
  • 打赏
  • 举报
回复
不是程序死掉了,是主线程阻塞了,另外开一线程负责传输,主线程维护界面,就不会“死掉”
laowang2 2013-12-27
  • 打赏
  • 举报
回复
怎么不用TCPClient,自己写要看看每次传输多少K?
_李小白 2013-12-27
  • 打赏
  • 举报
回复
两个都死了,但文件大小还在变
lhy 2013-12-27
  • 打赏
  • 举报
回复
是接收端死掉了还是发送端死掉了还是都死了,多大的文件开始死。都要说清楚。
lhy 2013-12-27
  • 打赏
  • 举报
回复
是不是缓冲区太小了?
_李小白 2013-12-27
  • 打赏
  • 举报
回复
引用 5 楼 zdrone 的回复:
这个跟你的程序应该没什么关系,可能是操作系统读写大缓冲区的时候造成了你的程序没有响应,但是线程还是在不断运行。我觉得用文件读取的时候用seek函数取相对固定大小的缓冲区,然后分次发送和粉刺接收会比较稳妥。
谢谢了 应该就是这个问题
_李小白 2013-12-27
  • 打赏
  • 举报
回复
哦 文件可以传成功 但是程序死了
zdrone 2013-12-27
  • 打赏
  • 举报
回复
这个跟你的程序应该没什么关系,可能是操作系统读写大缓冲区的时候造成了你的程序没有响应,但是线程还是在不断运行。我觉得用文件读取的时候用seek函数取相对固定大小的缓冲区,然后分次发送和粉刺接收会比较稳妥。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧