为什么recv会在一直等待?

crabscale 2007-08-01 11:54:03
程序已连接上ftp服务器,但还没发送USER ,PASS等请求信息。接收套结字为fd,我想输出ftp服务器发送过来的欢迎信息,如
220- 欢迎光临
===================================
welcome!
...
===================================
220 请用正确帐号登陆
因为服务器可能分几次把信息发送过来,所以用一个循环来接收信息,
while(recv(fd,temp,1024,0))
{
strcat(buf,temp);
printf("%s",buf);
}
结果输出到 "220 请用正确帐号登陆"后就阻塞了,我用fcntl把fd设置为O_NONBLOCK,但还是阻塞,请我这是什么原因?
...全文
918 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovejklife 2007-08-06
  • 打赏
  • 举报
回复
回复人:nihaoweihua() ( 一级(初级)) 信誉:100 2007-8-1 15:11:23 得分:0
?

你的recv(fd,temp,1024,0)是要从套接口fd中读取1024长的数据,由于ftp服务器发送过来的欢迎信息没有1024那么长,在该信息中也没有结束信息,所以recv在等待,等待读满1024长的信息。你可以计算以下你要读的信息长度,用strlen()函数就可以,然后用算出的结果替换参数1024应该就可以了
---------------------------------------------------------------------------------
简直是胡说
lovejklife 2007-08-06
  • 打赏
  • 举报
回复
最完美的方法来了!!!!!!!!!
就是recv后检查是否是正确的应答,是的就不在recv了,不正确就再recv。
别忘了给recv一个超时时间,呵呵
crabscale 2007-08-04
  • 打赏
  • 举报
回复
感觉处理服务器发送过来的消息还是有点麻烦的,
通过设置非阻塞模式,可以解决实现一些命令,比如pwd,help等,list也可以,但在做完list命令后(即把某个目录下的文件属性传送过来后),再做另一个命令比如pwd就无休止地等待了。我一开始以为是控制连接中的数据没有取完,但事实不是如此,不知如何解决?
crabscale 2007-08-02
  • 打赏
  • 举报
回复
当消息被send过去后,可能服务器还没来得及响应,返回的字节也是-1,后来我把代码改了一下
while((nread=recv(fd,buf,1024,0)==-1)
;
这样一来程序就正常了,但我感觉有点别扭,应该是while((nread=recv(fd,buf,1024,0)!=-1),然后一直接收数据直到结束。
nihaoweihua 2007-08-02
  • 打赏
  • 举报
回复
我先纠正一下我犯的错误,recv在没有将第4个参数设置成MSG_WAITALL时不会等待1024字节的,所以对于crabscale ()最开始问的问题,程序不是阻塞在等待1024字节上。设置非阻塞是正确的。


对于crabscale ()最后写的while((nread=recv(fd,buf,1024,0)!=-1)我觉得有一个问题,在服务器正常运行的情况下这个判断是可以顺利执行的,但服务器如果因为任何原因宕掉的话,recv返回的应该是0吧。while中的判断语句是处理不了这种情况的。这样写程序不够健壮。
dai_weitao 2007-08-01
  • 打赏
  • 举报
回复
数据一send过去,就被recv过来了,我只能用sleep(1)来延迟一下
=====================
难道不该一send就被recv过来吗? 你认为该怎样?
crabscale 2007-08-01
  • 打赏
  • 举报
回复
我一开始设置fd为O_NONBLOCK时写错代码了,现在改过来了。不过又发生了问题:
数据一send过去,就被recv过来了,我只能用sleep(1)来延迟一下,这样一来效率就大大降低了,每次send数据过去就要sleep(1)。

mymtom(mymtom)的建议可以试一下。谢谢各位!
mymtom 2007-08-01
  • 打赏
  • 举报
回复
由于FTP协议中的信息都以\r\n作为分隔标志,可以参考unp(Unix网络编程)里的readline函数。
cceczjxy 2007-08-01
  • 打赏
  • 举报
回复
你设置成O_NONBLOCK后,如果没数据,recv会返回-1,while()循环还条件成真,一直在循环,应该不是阻塞
在recv上,你可以 改成printf("aaaa-----%s\n",buf);看一下
dai_weitao 2007-08-01
  • 打赏
  • 举报
回复
在发送时加上\r\n
crabscale 2007-08-01
  • 打赏
  • 举报
回复
我怎么知道ftp服务器上发送过来的欢迎信息的长度呢? 这时还没有用帐号登陆啊
nihaoweihua 2007-08-01
  • 打赏
  • 举报
回复
你的recv(fd,temp,1024,0)是要从套接口fd中读取1024长的数据,由于ftp服务器发送过来的欢迎信息没有1024那么长,在该信息中也没有结束信息,所以recv在等待,等待读满1024长的信息。你可以计算以下你要读的信息长度,用strlen()函数就可以,然后用算出的结果替换参数1024应该就可以了

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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