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

这里的“通讯”加上了引号,是因为实际上所有的socket都有通讯的功能,只是在我们的例子中,之前那个socket只负责listen,而这个socket负责接受信息并echo回去。
 我们现看看这个函数:
bool TcpServer::isAccept()
{
    unsigned 
int clntAddrLen = sizeof(clntAddr);

    
if ( (communicationSock = accept(listenSock, (sockaddr*)&clntAddr, &clntAddrLen)) < 0 ) {
        
return false;
    } 
else {
        std::cout 
<< "Client(IP: " << inet_ntoa(clntAddr.sin_addr) << ") connected.\n";
        
return true;
    }
}

用accept()创建新的socket

        在我们的例子中,communicationSock实际上是用函数accept()创建的。
int accept(int socket, struct sockaddr* clientAddress, unsigned int* addressLength);
在Linux中的实现为:
/* Await a connection on socket FD.
   When a connection arrives, open a new socket to communicate with it,
   set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
   peer and *ADDR_LEN to the address's actual length, and return the
   new socket's descriptor, or -1 for errors.

   This function is a cancellation point and therefore not marked with
   __THROW.  
*/
extern int accept (int __fd, __SOCKADDR_ARG __addr,
           socklen_t 
*__restrict __addr_len);
这个函数实际上起着构造socket作用的仅仅只有第一个参数(另外还有一个不在这个函数内表现出来的因素,后面会讨论到),后面两个指针都有副作用,在socket创建后,会将客户端sockaddr的数据以及结构体的大小传回。
        当程序调用accept()的时候,程序有可能就停下来等accept()的结果。这就是我们前一小节说到的block(阻塞)。这如同我们调用std::cin的时候系统会等待输入直到回车一样。accept()是一个有可能引起block的函数。请注意我说的是“有可能”,这是因为accept()的block与否实际上决定与第一个参数socket的属性。这个文件描述符如果是block的,accept()就block,否则就不block。默认情况下,socket的属性是“可读可写”,并且,是阻塞的。所以,我们不修改socket属性的时候,accept()是阻塞的。

accept()的另一面connect()

        accept()只是在server端被动的等待,它所响应的,是client端connect()函数:
int connect(int socket, struct sockaddr* foreignAddress, unsigned int addressLength);
虽然我们这里不打算详细说明这个client端的函数,但是我们可以看出来,这个函数与之前我们介绍的bind()有几分相似,特别在Linux的实现中:
/* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
   For connectionless socket types, just set the default address to send to
   and the only address from which to accept transmissions.
   Return 0 on success, -1 for errors.

   This function is a cancellation point and therefore not marked with
   __THROW.  
*/
extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
connect() 也使用了const的sockaddr,只不过是远程电脑上的而非bind()的本机。
        accept()在server端表面上是通过listen socket创建了新的socket,实际上,这种行为是在接受对方客户机程序中connect()函数的请求后发生的。综合起看,被创建的新socket实际上包含了listen socket的信息以及客户端connect()请求中所包含的信息——客户端的sockaddr地址。

新socket与sockaddr的关系

        accept()创建的新socket(我们例子中的communicationSock,这里我们简单用newSock来带指)首先包含了listen socket的信息,所以,newSock具有本机sockaddr的信息;其次,因为它响应于client端connect()函数的请求,所以,它还包含了clinet端sockaddr的信息。
        我们说过,stream流形式的TCP协议实际上是建立起一个“可来可去”的通道。用于listen的通道,远程机的目标地址是不确定的;但是newSock却是有指定的本机地址和远程机地址,所以,这个socket,才是我们真正用于TCP“通讯”的socket。

inet_ntoa()
#include <arpa/inet.h>

/* Convert Internet number in IN to ASCII representation.  The return value
   is a pointer to an internal array containing the string.  
*/
extern char *inet_ntoa (struct in_addr __in) __THROW;
        对于这个函数,我们可以作为一种,将IP地址,由in_addr结构转换为可读的ASCII形式的固定用法。

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

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

相关文章

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循环…

一个网络资深者发起的思考

陈硕 (giantchen AT gmail) blog.csdn.net/Solstice 前几天我在新浪微博上出了两道有关 TCP 的思考题&#xff0c;引发了一场讨论 http://weibo.com/1701018393/eCuxDrta0Nn 。 第一道初级题目是&#xff1a; 有一台机器&#xff0c;它有一个 IP&#xff0c;上面运行了一个 TCP…

The Ransom of Red Chief

We can kidnap someone here. Who? Theres nobody rich in this town. The richest man in town, of course. Kidnap      绑架 rich         富 trouble      麻烦 Im not having a nice day. How much money have we got? Only two hundred dollars. Ra…

C++课堂整理--第一章内容

提前声明&#xff1a; 本文内容为华北水利水电大学研究生C课程&#xff0c;如有 侵权请告知&#xff0c;作者会予以删除 1.C特点 1.历史悠久。2.应用广泛。3.兼容c。4.面向对象。5.适合编写系统程序。6.有助于理解计算机的工作过程&#xff0c;深入理解计算机的原理和概念 …

oauth2 access_denied 不允许访问_OAuth 2 是什么-入门介绍

OAuth 2是什么OAuth 2是一个可以通过浏览器&#xff0c;手机等多种设备进行安全授权的一个标准简单的开源协议。随着互联网的兴起以及普及&#xff0c;越来越多的应用出现在用户的面前。这些应用大部分都是相对独立的以及由不同的公司进行运营的。不同的应用也保存了不同的数据…