免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11859 | 回复: 29
打印 上一主题 下一主题

Socket描述符可以是0吗? [复制链接]

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-04 12:57 |只看该作者 |倒序浏览
初接触UNIX的人都会在教材中得到这样的信息:文件描述符0、1和2分别代表stdin、stdout和stderr。所以,在自己的程序中往往都会避开这几个“标准”的描述符。对于网络的操作,一般在connect(或accept)后都会判断Socket描述符是否大于0来决定网络连接是否建立。

问题偏偏就出在这里。

一个SocketServer程序,accept客户端连接成功后创建一新的线程,将accept的返回值当作该线程的参数。在该线程中和客户端交互,执行所需的操作。

在客户端执行连接操作后,发现连接频频被Server断开,百思不解其意。

经过调试,方才发现在accept执行成功后返回值竟然会是0。

奇怪之余,却又无可奈何,修改Server端程序后问题解决。



操作系统:SunOS 5.8 编译器: SUNWorkspace Pro4.0 CC

论坛徽章:
0
2 [报告]
发表于 2005-01-04 13:07 |只看该作者

Socket描述符可以是0吗?

>;>;经过调试,方才发现在accept执行成功后返回值竟然会是0。

真的假的啊?不敢相信的说

论坛徽章:
0
3 [报告]
发表于 2005-01-04 13:12 |只看该作者

Socket描述符可以是0吗?

你的0,1,2是不是没打开啊?

论坛徽章:
0
4 [报告]
发表于 2005-01-04 13:13 |只看该作者

Socket描述符可以是0吗?

accept可以返回0,大于等于0代表成功了

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
5 [报告]
发表于 2005-01-04 13:29 |只看该作者

Socket描述符可以是0吗?

原帖由 "albcamus" 发表:
>;>;经过调试,方才发现在accept执行成功后返回值竟然会是0。

真的假的啊?不敢相信的说

呵,当然是真的了。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-01-04 13:38 |只看该作者

Socket描述符可以是0吗?

accept之后就得到了0?
一般而言0,1,2被关掉的可能性很小,这里socket应该>;0
是在accept之后打印出来是0还是在线程中打印出来是0?有可能参数传错了呢?

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
7 [报告]
发表于 2005-01-04 13:58 |只看该作者

Socket描述符可以是0吗?

Socket描述符是只有传给线程的:

  1.       int thr_id;
  2.       int *thread_para = new int;
  3.       *thread_para = nsock; // nsock是accept的返回值
  4.       thr_id = pthread_create(&my_thread_id, NULL, start_my_thread, (void*)thread_para);
复制代码

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
8 [报告]
发表于 2005-01-04 14:00 |只看该作者

Socket描述符可以是0吗?

我把accept后的返回值打印出来后,发现的确是可能等于0的。

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
9 [报告]
发表于 2005-01-04 14:01 |只看该作者

Socket描述符可以是0吗?

开始,我也不相信会有这样的事情发生 :-p
现在我开始怀疑connect后的socket描述符是不是也有可能是0呢? ^_^

论坛徽章:
0
10 [报告]
发表于 2005-01-04 14:02 |只看该作者

Socket描述符可以是0吗?

这本来就不是什么“事情”吗。
man accept看,ret = -1 失败,》= 0 成功。

具体说,你程序中做了(也可能是隐含的)close(0), accept返回0不就是很好的么。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP