免费注册 查看新帖 |

Chinaunix

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

[网络] 以下七种方式的TCP链接怎么实现。 [复制链接]

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-30 09:39 |只看该作者 |倒序浏览
本帖最后由 cxytz01 于 2012-11-30 09:55 编辑

所有链接都是TCP,要求给出SERVER和CLIENT的函数,给出函数参数。最好附上说明。

链接方式一:
    同步链接

链接方式二:
    异步链接

链接方式三:
    长链接

链接方式四:
    短链接

链接方式五:
    单工链接

链接方式六:
    非阻塞链接

链接方式七:
    阻塞链接


补充问题 客户端connect上了服务端,如何保持一个链路不断开? 是使用setsockopt的keepalive吗?还是客户,服务端共同定义一个心跳报文格式,客户端发过去就行了?

论坛徽章:
0
2 [报告]
发表于 2012-11-30 10:43 |只看该作者
1, 同步异步和阻塞非阻塞很容易混淆。我也说不清楚。

2,bsd socket中,recv, send默认是阻塞的,可以通过设置成非阻塞的。网络模式reactor,proactor是同步异步的概念。
单工链接指同一时间只有客户端发数据给服务端,或者服务端发数据给客户端,类似车流单向双向的概念。

3,tcp短连接是连接后,发送一条消息就断开;tcp长连接是持续发送消息

4,客户端connect上了服务器,如何保证一个链路不断开。
可以用心跳机制。setsocketopt的keepalive不精确,要经过大概2小时才会触发。一般做法都是自己在应用层做个心跳机制。也就是你说的后者。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
3 [报告]
发表于 2012-11-30 14:26 |只看该作者
本帖最后由 cxytz01 于 2012-11-30 14:45 编辑

没人回答,那我来总结下我的理解

链接方式一:
    同步链接,所有fd创建之后都是同步链接,不必设置

链接方式二:
    异步链接,1)int as = 1;
                      pid_t pid = getpid();
                       signal(SIGIO, &input_handler); /* dummy sample; sigaction(  ) is better */
                       ioctl(fd, FIOSETOWN, &pid);
                       ioctl(fd, FIOASYNC, &as)   
                   或者
                   2)signal(SIGIO, &input_handler); /* dummy sample; sigaction(  ) is better */
                      fcntl(STDIN_FILENO, F_SETOWN, getpid(  ));
                      oflags = fcntl(STDIN_FILENO, F_GETFL);fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);

链接方式三:
    长链接,不是很明了,但可以肯定,只要定义一个心跳报文,以一定时间间隔发送给对方,就算的上是长连接。
                 但不知道setsocktopt 的alive用来做什么用

链接方式四:
    短链接,同上,不设置心跳报文,就算得上是端连接

链接方式五:
    单工链接,shutdown(fd, SHUT_WR)  关闭写,使之成为读单工
                   shutdown(fd, SHUT_RD)   关闭读,使之成为写单工
                   当然,就算不执行上面两个步骤,双工链路,只要你只使用read或write也算得上是单工的作用                  

链接方式六:
    非阻塞链接,1) int nb = 1;
                          ioctl(s, FIONBIO, &nb);
                      或
                      2) fcntl(socket, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK);

链接方式七:
    阻塞链接,所有fd创建之后默认是阻塞链接,不必设置。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
4 [报告]
发表于 2012-11-30 17:54 |只看该作者
刚看了unp卷一,以上我列出的都是同步IO,其中链接二不是异步链接(我搞错了),而是信号驱动I/O,同属于同步I/O。

只要引用recv,recvfrom的程序,全属于同步I/O。

recv,recvfrom 当内核把数据报准备好时,就会从内核将数据报拷贝到用户空间,这个过程就会阻塞。

异步I/O是不需要用户进程调用recv,recvfrom切换到内核态,拷贝数据到用户空间的。而是让内核帮我们搞定,当内核搞定后,通知我们程序,进行处理数据报文。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2012-12-02 13:15 |只看该作者
问题比较无聊, 读读开源server代码吧.

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
6 [报告]
发表于 2012-12-03 15:41 |只看该作者
能讲讲你对这几个问题的见解吗? 或许对你来说无聊,但对我而言是一次进步的机会啊。

linux_c_py_php 发表于 2012-12-02 13:15
问题比较无聊, 读读开源server代码吧.

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
7 [报告]
发表于 2012-12-03 15:50 |只看该作者
关于tcp_keepalive我理解了,

so_keepalive 给tcp套接口设置一个保持存活选项,如果2小时内在此套接口的任一方向都没有数据交换,tcp就会自动给对方发一个保持存活探测分解。这是一个对方鼻血响应的tcp分节。

。。。

所以这个选项的目的是不是保持长连接,而是检测对方是否崩溃

对此选项的一个常见问题是时间参数是否可改(常常是想将2小时的无活动周期改为短些的值)。大多数内核是以整个内核为基础维护这些时间参数的,而不是以每个套接口为基础来维护的,因此若将无活动周期从2小时改为(譬如)15分钟,则将影响到主机上所有打开了此选项的套接口。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
8 [报告]
发表于 2012-12-03 15:56 |只看该作者
这个选项多是服务器设置,服务器使用此选项是因为它们花大部分时间阻塞于等待跨tcp连接的输入上。如果不设置此选项,而客户机崩溃,服务器将永远不会知道,并将继续等待客户的输入。保持存活选项将监测出这些半开连接并终止他们。

cxytz01 发表于 2012-12-03 15:50
关于tcp_keepalive我理解了,

so_keepalive 给tcp套接口设置一个保持存活选项,如果2小时内在此套接口的 ...

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
9 [报告]
发表于 2012-12-03 15:58 |只看该作者
本帖最后由 cxytz01 于 2012-12-03 15:59 编辑

所以啊,所谓的长短连接并不存在,tcp连接一旦建立就会保持下去。

短连接只不过是我用完了,我就把连接关闭了。
而长连接,是只我永远不关闭,但是出了问题,需要重连。 这就是心跳报文的作用,用于监测对方是否存活。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
10 [报告]
发表于 2012-12-03 16:06 |只看该作者
做下笔记:

大多数 Rlogin 和 Telent 服务器设置这些选项,以在交互式客户未注销就挂断电话线或终端电源的情况下也能终止连接。
有些服务器,常常是FTP服务器,提供一个分钟数量级的超时。这是由应用进程本身完成的,一般在读下一个客户命令的read调用附近。这个超时与此套接口选项无关。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP