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

前面一小节,我们已经写出了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的概念以后再解释)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIS之土地利用数据下载

下载链接&#xff1a; 全球地表覆盖-数据浏览 数据说明&#xff1a; 具体请查看官网: 全球地表覆盖-产品介绍 下载步骤&#xff1a;

Scribe应用实例

源代码里所给的example很简单&#xff0c;但大体上了模拟了其运行的过程&#xff0c;分三个部分。可参考里面的README文件&#xff1a;Configurarion&#xff08;配置&#xff09;、Running Scribe Server&#xff08;运行服务器&#xff09;、Logging messages&#xff08;记录…

群晖docker签到京豆_利用Synology(群晖)Docker安装签到框架

利用Synology(群晖)Docker安装签到框架Mark • 2018 年 05 月 15 日1、前言之前一直想自己开一套WEB签到工具用&#xff0c;一方面是精力有限(老了)&#xff0c;另一方面技术能力欠佳一直没有搞。去年时候在偶然机会下在V2ex了解到Binux大佬开发的一套签到框架系统qiandao&…

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

这里的“通讯”加上了引号&#xff0c;是因为实际上所有的socket都有通讯的功能&#xff0c;只是在我们的例子中&#xff0c;之前那个socket只负责listen&#xff0c;而这个socket负责接受信息并echo回去。我们现看看这个函数&#xff1a;boolTcpServer::isAccept() { unsi…

python离线安装pip出现timeout_Python pip安装包出现timeout的解决办法,修改国内的镜像源...

今天安装django时老是出现timeoutWARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ConnectTimeoutError(at 0x00000000044BC9B0>, Connection to pypi.org timed out. (connect timeout15)): /simple/dian…

DIY_DE2开发板介绍

Altera官方有一个DE2开发板&#xff0c;该开发板的资源很丰富&#xff0c;外设也很齐全&#xff0c;采用的是十层电路板设计&#xff0c;价格自然很高了。本人仿照其原理图自制了一块&#xff0c;叫做DIY_DE2开发板。开发板采用核心板和底板的模式&#xff0c;方便使用&#xf…

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

现在&#xff0c;我们通过accept()创建了新的socket&#xff0c;也就是我们类中的数据成员communicationSock&#xff0c;现在&#xff0c;我们就可以通过这个socket进行通讯了。TCP通讯模型在介绍函数之前&#xff0c;我们应该了解一些事实。TCP的Server/Client模型类似这样&a…

利用ROC找阈值点cutpoint

def Find_Optimal_Cutoff(TPR, FPR, threshold):y TPR - FPRYouden_index np.argmax(y)#阈值optimal_threshold threshold[Youden_index]#阈值对应的点point [FPR[Youden_index], TPR[Youden_index]]return optimal_threshold, pointtest_fpr, test_tpr, test_thresholds …

json中怎么去掉[]外的引号_如何正确检查发动机中的机油量?从机油尺处向外窜气是怎么回事?...

机油是发动机的血液&#xff0c;发动机中必须有足够多的机油&#xff0c;才能完成润滑、冷却等任务。为了让驾驶员随时能够查看到发动机中机油的存量&#xff0c;在发动机上都设置了一个机油尺&#xff0c;我们只要把它拔出来&#xff0c;就可以查看机油的液位了&#xff1b;而…

flex常见问题归纳

flex警告&#xff1a;swc“D:\Adobe\Adobe Flash Builder 4.5\sdks\4.5.1\frameworks\libs\framework.swc”具有默认样式并且在 library-path 中&#xff0c;表示依赖项将不带有样式进行链接。这可能会导致使用输出 swc 的应用程序出现外观丢失的现象。swc 应该放置在 external…

arcgis符号系统的分类方法介绍

使用标准分类方案 类范围和间隔的定义方式可确定属于各个类的数据的量以及地图的外观。分类方案包括两个主要部分&#xff1a;组织数据所参照的类数目以及指定类时所依据的方法。类数目取决于您的分析目的。然而&#xff0c;需要对为类分配数据时所依据的规则进行简要说明。对…

k8s往secret里导入证书_k8s中secret解析

概览Secret是用来保存小片敏感数据的k8s资源&#xff0c;例如密码&#xff0c;token&#xff0c;或者秘钥。这类数据当然也可以存放在Pod或者镜像中&#xff0c;但是放在Secret中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。用户可以创建自己的secret&#x…

HDU1856_More is better

题目大意&#xff1a; 让你输入n,然后输入n组数据&#xff0c;表示a与b的关系&#xff0c;最后求出关系最多一组的个数。注意&#xff08;a与b有关系&#xff0c;b与c有关系&#xff0c;那么a与c就有关系&#xff09; 解题思路&#xff1a; 并查集&#xff0c;…

html爱心代码

此处填写你爱人的名字 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!doctype html> <html> <head><meta charset&qu…

Linux TCP server系列(4)-浅谈listen与大并发TCP连接

背景&#xff1a; 服务器在调用listen和accept后&#xff0c;就会阻塞在accept函数上&#xff0c;accpet函数返回后循环调用accept函数等待客户的TCP连接。如果这时候又大量的用户并发发起connect连接&#xff0c;那么在listen有队列上限(最大可接受TCP的连接数)的情况下&#…

领航机器人广告段子_医院机器人物流广告词_段子网收录最新段子

瑞典RJO医疗供应商&#xff0c;机器人自助式物流领航者&#xff0c;拥有自己的机器人工作组&#xff0c;让医院处处散发出高科技。使用机器人物流体系&#xff0c;医院内部运输物料在标准化、可控、准时、高效方面有质的改变&#xff0c;大大提高医院对外形象。特征集广告词&am…

分享制作精良的知识管理系统 配置SQL Server文档数据库 完美实现博客文章的的下载,存储和浏览...

前一篇文章《分享制作精良的知识管理系统 博客备份程序 Site Rebuild》已经提到如何使用Site Rebuild来下载您所喜欢的博客文章&#xff0c;但是还不能实现把下载的文件导入进数据库中&#xff0c;无法实现在线浏览服务器中的文档数据。这一篇文章则帮助您建立文档数据库&#…

python绘制敏感性和特异性曲线(交叉)

示例 代码如下 test_fpr, test_tpr, test_thresholds roc_curve(y_test_two, dataset_blend_test_pred, pos_label1) test_roc_auc auc(test_fpr, test_tpr) plt.plot(test_thresholds, 1-test_fpr, labelspecificity) plt.plot(test_thresholds, test_tpr, labelsensitivit…

python迭代器创建序列_Python 中迭代器与生成器实例详解

Python 中迭代器与生成器实例详解本文通过针对不同应用场景及其解决方案的方式&#xff0c;总结了Python中迭代器与生成器的一些相关知识&#xff0c;具体如下&#xff1a;1.手动遍历迭代器应用场景&#xff1a;想遍历一个可迭代对象中的所有元素&#xff0c;但是不想用for循环…