免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: kukule75
打印 上一主题 下一主题

[函数] 关于socket的两个疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-06-25 20:47 |只看该作者
看起来你认为问题在这个 片段,那就只好想破脑袋咯~

论坛徽章:
0
12 [报告]
发表于 2008-06-25 20:48 |只看该作者
原帖由 r2r4 于 2008-6-25 20:47 发表
看起来你认为问题在这个 片段,那就只好想破脑袋咯~


我是不清楚问题在哪,请指教;

[ 本帖最后由 kukule75 于 2008-6-25 20:49 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2008-06-25 21:15 |只看该作者
我也不知道问题在哪里阿,至少你给出skt是什么东西,有没有setsockopt

论坛徽章:
0
14 [报告]
发表于 2008-06-25 21:18 |只看该作者
原帖由 r2r4 于 2008-6-25 21:15 发表
我也不知道问题在哪里阿,至少你给出skt是什么东西,有没有setsockopt


代码贴全了,希望大牛帮忙看看

论坛徽章:
0
15 [报告]
发表于 2008-06-26 00:21 |只看该作者
我用楼主的代码测试了一下,可以收到数据的。(去掉了代码中的数据处理部分)
楼主不妨重新测试一下,看是否是其他地方出问题,让你误以为是没有收到。
非阻塞的socket这样子循环去取是一种不合理的方式,最终的结果会是,超时以后
recv channel list error: Resource temporarily unavailable

此后,虽然程序终止了,但是服务器port 80和本地电脑一直有数据 P,F 包传送。我观察的大约5分钟之内,他们没有停止,我猜测可能是http协议并没有意识到连接已经终止。
他们没有终止的意向,最后我只好用rc脚本重新启动了网络。

有空会细细观察一下这个东西乱发的什么数据包。

BTW:
不是每个服务器你对它get它就一定理会你,你的get数据需要没有错误。如果有错,它直接给你fin,get一下baidu.com,就是这种结果。
另外一些可能给你个错误提示。

[ 本帖最后由 r2r4 于 2008-6-26 00:29 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2008-06-26 09:29 |只看该作者

回复 #15 r2r4 的帖子

1.
  1. 非阻塞的socket这样子循环去取是一种不合理的方式,最终的结果会是,超时以后
复制代码

谢谢你的提醒,问题就出在这,实际上程序收到数据(是不是全部数据就不清楚了,我在循环中计数了,发现循环次数不是0),只是最后并没有按照我预想的由条件while(how > 0)退出循环;还有我换一个请求条件和服务器,结果正常退出,并没有超时。这可能是什么原因?recv函数本身就是阻塞调用,为什么说这是非阻塞的socket?对于非阻塞的socket我因该怎么取数据?
2.
程序终止后,还有数据发送,这可能是与软件用的协议相关(我模仿的是pplive)。只是我不明白,都close(shutdown)了,怎么还能发送数据?

[ 本帖最后由 kukule75 于 2008-6-26 10:07 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-06-26 11:32 |只看该作者

回复 #16 kukule75 的帖子

>>程序终止后,还有数据发送,这可能是与软件用的协议相关(我模仿的是pplive)。只是我不明白,都close(shutdown)了,怎么还能发送数据?

貌似PPLIVE有用TCP协议传输数据,因为TCP会出现半关闭连接的情况,在这种情况下,即使你客户端发送了断开请求,服务端同样会有数据传输过来

论坛徽章:
0
18 [报告]
发表于 2008-06-26 12:06 |只看该作者
我觉得可以用select()和非阻塞的recv()去看一下socket里面有没有数据过来,然后再接收数据。

有可能服务器端send出你要的数据,在你client端还没有接收到的时候就close()了,好像也不能

recv到。你可以做个dummy版的server端,看看你的client端程序是否出错,如果dummy程序

是正确的,client端程序也是正常运行,我觉得应该是server端某个处理不好。

论坛徽章:
0
19 [报告]
发表于 2008-06-26 15:49 |只看该作者
原帖由 mafiaguy 于 2008-6-26 11:32 发表
>>程序终止后,还有数据发送,这可能是与软件用的协议相关(我模仿的是pplive)。只是我不明白,都close(shutdown)了,怎么还能发送数据?

貌似PPLIVE有用TCP协议传输数据,因为TCP会出现半关闭连接的情况 ...


http本身就是tcp阿,我程序里的socket也是tcp阿

论坛徽章:
0
20 [报告]
发表于 2008-06-26 16:08 |只看该作者
原帖由 ykyxgz 于 2008-6-26 12:06 发表
我觉得可以用select()和非阻塞的recv()去看一下socket里面有没有数据过来,然后再接收数据。

有可能服务器端send出你要的数据,在你client端还没有接收到的时候就close()了,好像也不能

recv到。你可以做 ...


我觉得我的程序不会出现没收到数据就close的情况;
要么程序正常收到数据,之后close;
要么程序超时退出
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP