前面一小节,我们已经写出了TcpServer的构造函数。这个函数的实际作用,就是创建了listen socket(监听嵌套字)。这一节,我们来具体分析这个创建的过程。

socket和sockaddr的创建是可以相互独立的

在函数中,我们首先通过socket()系统调用创建了listenSock,然后通过为结构体赋值的方法具体定义了服务器端的sockaddr。(memset()函数的作用是把某个内存段的空间设定为某值,这里是清零。)其他的概念已经在前一小节讲完了。这里需要补充的是说明宏定义INADDR_ANY。这里的意思是使用本机所有可用的IP地址。当然,如果你机器绑定了多个IP地址,你也可以指定使用哪一个。

数据流简易模型(SOCK_STREAM)

我们的例子以电话做的比喻,实际上,socket stream模型不完全类似电话,它至少有以下这些特点:
1、一种持续性的连接。这点跟电话是类似的,也可以想象成流动着液体的水管。一旦断开,这种流动就会中断。
2、数据包的发送实际上是非连续的。这个世界上有什么事物是真正的线性连续的?呵呵,扯远了,这貌似一个哲学问题。我们仅仅需要知道的是,一个数据包不可能是无限大的,所以,总是一个小数据包一个小数据包这样的发送的。这一点,又有点像邮包的传递。这些数据包到达与否,到达的先后次序本身是无法保证的,即是说,是IP协议无法保证的。但是stream形式的TCP协议,在IP之上,做了一定到达和到达顺序的保证。
3、传送管道实际上是非封闭的。要不干嘛叫“网络”-_-!!!。我们之所以能保证数据包的“定点”传送,完全是依靠每个数据包都自带了目的地址信息。
        由此可见,虽然socket和sockaddr可以分别创建,并无依赖关系。但是在实际使用的时候,一个socket至少会绑定一个本机的sockaddr,没有自己的“地址信息”,就不能接受到网络上的数据包(至少在TCP协议里面是这样的)。

socket与本机sockaddr的绑定

有时候绑定是系统的任务,特别是当你不需要知道自己的IP地址和所使用的端口号的时候。但是,我们现在是建立服务器,你必须告诉客户端你的连接信息:IP和Port。所以,我们需要指明IP和Port,然后进行绑定。

int bind(int socket, struct sockaddr* localAddress, unsigned int addressLength);

作为C++的程序员,也许你会觉得这个函数很不友好,它似乎更应该写成:

int bind_cpp_style(int socket, const sockaddr& localAddress);

我们需要通过函数原型指明两点:
1、我们仅仅使用sockaddr结构的数据,但并不会对原有的数据进行修改;
2、我们使用的是完整的结构体,而不仅仅是这个结构体的指针。(很显然光用指针是无法说明结构体大小的)
幸运的是,在Linux的实现中,这个函数已经被写为:

#include <sys/socket.h>

/* Give the socket FD the local address ADDR (which is LEN bytes long).  */
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
     __THROW;

看到亲切的const,我们就知道这个指针带入是没有“副作用”的。

监听:listen()

stream流模型形式上是一种“持续性”的连接,这就是要求信息的流动是“可来可去”的。也就是说,stream流的socket除了绑定本机的sockaddr,还应该拥有对方sockaddr的信息。在listen()中,这“对方的sockaddr”就可以不是某一个特定的sockaddr。实际上,listen socket的目的是准备被动的接受来自“所有”sockaddr的请求。所以,listen()反而就不能指定某个特定的sockaddr。

int listen(int socket, int queueLimit);

其中第二个参数是等待队列的限制,一般设置在5-20。Linux中实现为:

#include <sys/socket.h>

/* Prepare to accept connections on socket FD.
   N connection requests will be queued before further requests are refused.
   Returns 0 on success, -1 for errors.  */
extern int listen (int __fd, int __n) __THROW;

完成了这一步,回到我们的例子,就像是让你小弟在电话机前做好了接电话的准备工作。需要再次强调的是,这些行为仅仅是改变了socket的状态,实际上我想强调的是,为什么这些函数不会造成block(阻塞)的原因。(block的概念以后再解释)

socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字相关推荐

  1. socket 编程入门教程(三)TCP原理:5、TCP的三次握手(three-way handshake)

    socket 编程入门教程(三)TCP原理:5.TCP的三次握手(three-way handshake) 前面3个小节介绍了socket机制对TCP协议三次握手的实现,需要强调的是,与协议独立于实现 ...

  2. socket 编程入门教程(一)TCP server 端:1、建模

    绝大部分关于socket编程的教程总是从socket的概念开始讲起的.要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分 ...

  3. socket 编程入门教程(五)UDP原理:4、“有连接”的UDP

    2019独角兽企业重金招聘Python工程师标准>>> 虽然UDP是无连接的,但是也可以通过调用connect()将本地的UDP socket FD与一个远程的UDP socket ...

  4. socket 编程入门教程(一)TCP server 端:7、接收与发送

    现在,我们通过accept()创建了新的socket,也就是我们类中的数据成员communicationSock,现在,我们就可以通过这个socket进行通讯了. TCP通讯模型 在介绍函数之前,我们 ...

  5. socket 编程入门教程(一)TCP server 端:6、创建“通讯 ”嵌套字

    这里的"通讯"加上了引号,是因为实际上所有的socket都有通讯的功能,只是在我们的例子中,之前那个socket只负责listen,而这个socket负责接受信息并echo回去. ...

  6. python socket编程_最基础的Python的socket编程入门教程

    本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在Python 3.4下. Python的sock ...

  7. Webservice入门教程_用Eclipse的TCP_IP工具监听请求实现端口转接

    场景 项目专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/37726 Webservice入门教程_用JDK开发Webservice ...

  8. socket 编程入门教程(一)TCP server 端:4、构造函数涉及的概念

    话题回到"黑社会办公室"的例子,讲概念已经扯得比较远了,不过,这一节我们还得讲概念,不过好在有些程序的例子.如果大家不想翻回去看TcpServer类的原型,我这里直接给出这个头文件 ...

  9. socket 编程入门教程(一)TCP server端:3、sockaddr与sockaddr_in

    2019独角兽企业重金招聘Python工程师标准>>> 收件人地址 一家化妆品公司将一批新产品的样品,准备发给某学校某个班的女生们免费试用.通常情况下,这件邮包的地址上可以这么写: ...

最新文章

  1. bitmap数据格式
  2. collection包下Counter类统计list中各个元素出现的次数
  3. C语言中结构体的初始化
  4. 计算机系统win7安装教程,惠普EliteDesk 705 G3电脑安装win7系统方法
  5. wifi rssi 计算 距离_WiFi和WLAN是一样的?真相在这里~别再傻傻分不清了
  6. 直接请求接口_【分享】接口是什么?实现原理的是什么?
  7. RabbitMQ 集群原理和完善
  8. c++小学生信息学奥赛变量练习(魔方)
  9. IP Routing 概述
  10. 【技术面试官如何提问】
  11. Calendar(日历)
  12. 基于单片机的超市储物柜设计_基于单片机的自动存储柜的设计
  13. 小说更新太慢怎么办_小说:圣墟(挺好看的一部小说,现在更新非常慢)
  14. 《Unity开发实战》——1.3节设置首选项
  15. \t\tFlash网页游戏辅助工具制作简析
  16. 手写C语言之goto语句-小冷气炸了,整蛊关机程序实现(10)
  17. uni-ui使用方式
  18. 计算机组成(超详细)+附带思维导图
  19. (转)蚂蚁变大象:浅谈常规网站是如何从小变大的
  20. Vue 实时获取文本框内容

热门文章

  1. mysql5.7.11 创建用户_修改更新查找MySQL5.7.x的root用户的默认密码
  2. java 文件inputstream_java – 如何在InputStream中接收多个文件并相应地处理它?
  3. 【OS学习笔记】十七 保护模式五:保护模式下如何进行内存保护 与 别名段的意义与作用
  4. Linux 总线、设备、驱动模型的探究
  5. LOJ#6282. 数列分块入门 6
  6. 2-jQuery - AJAX load() 方法【进阶篇】
  7. link2001错误无法解析外部符号metaObject
  8. ADO.NET Entity Framework 使用中的经验总结
  9. css入门之head区设置
  10. GPLT2017题目