• 全部
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
  • 问答

给出有问题代码!请大虾帮看看!Linux下使用socket传输文件(为客户端),在将服务端网络断开后为什么客户端还在Recv,程序不结束!

ecwaychina 2006-07-06 09:24:58
下面是写文件的部分代码,将传输文件时我将服务端网络断开后(拔掉网线),程序执行到 write_normal_msg(" TCP/IP FullReceiveFile: begin recv file");写完日志后就不往下走啦,还在Recv,这时网络已经断开啦。应该要退出的,服务端时使用VC6.0。调试环境为公司局域网。
while (fileloop == 0)
{

write_normal_msg(" TCP/IP FullReceiveFile: begin recv file");
memset(rcvbuf,0x00,sizeof(rcvbuf));
iBytesRead=recv(sockfd, rcvbuf, FILEPACKAGE, 0); //接收
write_normal_msg(" TCP/IP FullReceiveFile: after recv file");
if (iBytesRead<=0){
return -1;
}
write_normal_msg(" TCP/IP FullReceiveFile: after check recv file");
memset(msgstr,0x00,sizeof(msgstr));
sprintf(msgstr," TCP/IP FullReceiveFile: iBytesRead %d ",iBytesRead);
write_normal_msg(msgstr);
if ((rcvbuf[iBytesRead-6]==0x19) && (rcvbuf[iBytesRead-5]==0x19) && (rcvbuf[iBytesRead-4]==0x20) &&(rcvbuf[iBytesRead-3]==0x20) &&(rcvbuf[iBytesRead-2]==0x20) && rcvbuf[iBytesRead-1]==0x19){
data = (char *)malloc(iBytesRead-4);
memset(data,0x00,iBytesRead-4);
for (i = 0 ;i < iBytesRead-4 ;i++){
data[i] = rcvbuf[i];
}
fwrite(data,iBytesRead-6,1,fp);
//write_normal_msg(" FullReceiveFile : Write File End");
free(data);
break;
}
else
{
fwrite(rcvbuf,iBytesRead,1,fp);
//write_normal_msg(" FullReceiveFile : Write File Data");
}
}
...全文
161 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
swallowma 2007-01-23
mark
回复
Hellboy 2006-07-06
拔掉网线
哈哈

tcpip在拔掉网线以后不会得到任何通知,
recv会一直都在那边。

你可以试试把服务程序关了,这样recv会返回 -1

有个办法,给recv()设置一个超时时间,SOL_TIMEOUT


==========广告签名============
http://shop33712512.taobao.com
淘宝店,专卖化妆品、自家蜂产品
==========广告签名============
回复
YanDong_8212 2006-07-06
好象是阻塞在
iBytesRead=recv(sockfd, rcvbuf, FILEPACKAGE, 0);
你检查下服务器端的端口和连接情况。
回复
发帖
Linux/Unix社区
创建于2007-08-27

2.0w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
帖子事件
创建了帖子
2006-07-06 09:24
社区公告
暂无公告