免费注册 查看新帖 |

Chinaunix

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

[求助]这样的TCP连接搞不懂 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-23 14:16 |只看该作者 |倒序浏览
用TCP来实现一个socket通信时,Server正常建立Listen监听套接字,Accept接受到了Client的连接请求,但是我控制Server端,使它没有为这个Client建立通信的套接字,也就是说Client端的通信套接字建立了,Server端的套接字没有建立。但是通过netstat在Server侧观察到的状态是:ESTABLISHED。
----------------------------------------------------------------------------------------------
而且使用ethereal时,确实能抓到三次握手的链路初始化消息
-----------------------------------------------------------------------------------------------
Client端也是能够发送出消息,但是Server端收不到消息。
这里偶感到奇怪的是Client是怎么发送出消息的呢,难道目前的这种TCP连接,已经类似无连接情况下的UDP了,Client发送出的消息又跑到哪去了?

论坛徽章:
0
2 [报告]
发表于 2007-01-23 14:54 |只看该作者
劝lz看看TCP的状态转换图

Server通过socket(),bind(),listen(),accept()等待Client的连接

Client通过socket(),connect()连接Server,

只要accept()正确返回,Server就处于ESTABLISHED,

connect()正确返回,Client就处于ESTABLISHED

请问lz是如何控制Server的??

论坛徽章:
0
3 [报告]
发表于 2007-01-24 10:34 |只看该作者
原帖由 zsniper 于 2007-1-23 14:54 发表
请问lz是如何控制Server的?? ...


我的意思是我在Server端收到Client连接请求时,我并没有在Server侧创建用来数据传送与读取的Socket,Client那边则是正常处理的。但是这种情况的连接在Server和Client两侧查看的状态都是ESTABLISHED。
问题就是消息发送和接收不正常了。

论坛徽章:
0
4 [报告]
发表于 2007-01-24 11:00 |只看该作者
原帖由 nashi2000 于 2007-1-23 14:16 发表
Accept接受到了Client的连接请求,但是我控制Server端,使它没有为这个Client建立通信的套接字 ...



请问搂主,你是如何做到这点的?accept可是就建立了一个socket的阿。

论坛徽章:
0
5 [报告]
发表于 2007-01-24 11:16 |只看该作者
原帖由 ttvast 于 2007-1-24 11:00 发表



请问搂主,你是如何做到这点的?accept可是就建立了一个socket的阿。



所以我也很费解

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2007-01-24 11:24 |只看该作者

仔细看看UNP吧

仔细看看UNP吧
服务器端的accept()是用来弹出tcp_backlog队列的已连接成员的
不用accept()一样可以完成三步握手
因为这个原因, 一定要把listen类型socket设置成非阻塞,否则select,poll,epoll之后有可能挂住accept

论坛徽章:
0
7 [报告]
发表于 2007-01-24 16:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2007-01-24 16:54 |只看该作者
原帖由 kiss007 于 2007-1-24 16:49 发表



一定要把listen类型socket设置成非阻塞,否则select,poll,epoll之后有可能挂住accept

能否详细解释一下,多谢


一起等待解释。用了poll以后为什么还需要设置非阻塞

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-01-24 17:56 |只看该作者
哦,这样的

poll/select/epoll事件发生以后
假设CPU很忙, 过了一段时间才执行到accept()
此时客户端发了一个RST包给服务器
这时这个ESTABLISH就消失了,连接队列里这个连接就没有了!
如果连接队列因此恰好空了
accept就死等在那里
所以listen要非阻塞
accept就不会死等

论坛徽章:
0
10 [报告]
发表于 2007-01-25 15:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP