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

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

#ifndef TCPSERVERCLASS_HPP_INCLUDED
#define TCPSERVERCLASS_HPP_INCLUDED

#include 
<unistd.h>
#include 
<iostream>
#include 
<sys/socket.h>
#include 
<arpa/inet.h>

class TcpServer
{
private:
    
int listenSock;
    
int communicationSock;
    sockaddr_in servAddr;
    sockaddr_in clntAddr;
public:
    TcpServer(
int listen_port);
    
bool isAccept();
    
void handleEcho();
};


#endif // TCPSERVERCLASS_HPP_INCLUDED
我们已经解释了为什么listenSock和communicationSock的类型是int,以及sockaddr_in是什么结构,现在来写这个类的构造函数:
TcpServer::TcpServer(int listen_port)
{
    
if ( (listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {
        
throw "socket() failed";
    }

    memset(
&servAddr, 0sizeof(servAddr));
    servAddr.sin_family 
= AF_INET;
    servAddr.sin_addr.s_addr 
= htonl(INADDR_ANY);
    servAddr.sin_port 
= htons(listen_port);

    
if ( bind(listenSock, (sockaddr*)&servAddr, sizeof(servAddr)) < 0 ) {
        
throw "bind() failed";
    }

    
if ( listen(listenSock, 10< 0 ) {
        
throw "listen() failed";
    }
}
好,先看看程序培养一下感觉,我们还得说概念。

数据封装(Data Encapsutation)

        我们前面说到了网络分层:链路——网络——传输——应用。数据从应用程序里诞生,传送到互联网上每一层都会进行一次封装:
Data>>Application>>TCP/UDP>>IP>>OS(Driver, Kernel & Physical Address)
我们用socket重点描述的是协议,包括网络协议(IP)和传输协议(TCP/UDP)。
sockaddr重点描述的是地址,包括IP地址和TCP/UDP端口。

socket()函数

    我们从TcpServer::TcpServer()函数可以看到,socket和sockaddr的产生是可以相互独立的。socket()的函数原型是:
int socket(int protocolFamily, int type, int protocol);
在Linux中的实现为:
#include <sys/socket.h>

/* Create a new socket of type TYPE in domain DOMAIN, using
   protocol PROTOCOL.  If PROTOCOL is zero, one is chosen automatically.
   Returns a file descriptor for the new socket, or -1 for errors.  
*/
extern int socket (int __domain, int __type, int __protocol) __THROW;
第一个参数是协议簇(Linux里面叫作域,意思一样的),还是那句话,我们这篇教程用到的就仅仅是一个PF_INET(protocol family : internet),很多时候你会发现人们也经常在这里赋值为AF_INET,事实上,当前,AF_INET就是PF_INET的一个#define,但是,写成PF_INET从语义上会更加严谨。这也就是TCP/IP协议簇中的IP协议(Internet Protocol),网络层的协议。
后面两个参数定义传输层的协议。
第二个参数是传输层协议类型,我们教程里用到的宏,只有两个:SOCK_STREAM(数据流格式)和SOCK_DGRAM(数据报格式);(具体是什么我们以后讨论)
第三个参数是具体的传输层协议。当赋值为0的时候,系统会根据传输层协议类型自动匹配和选择。事实上,当前,匹配SOCK_STREAM的就是TCP协议;而匹配SOCK_DGRAM就是UDP协议。所以,我们指定了第二个参数,第三个就可以简单的设置为0。不过,为了严谨,我们最好还是把具体协议写出来,比如,我们的例子中的TCP协议的宏名称:IPPROTO_TCP。

数据的“地址”

        从数据封装的模型,我们可以看到数据是怎么从应用程序传递到互联网的。我们说过,数据的传送是通过socket进行的。但是socket只描述了协议类型。要让数据正确的传送到某个地方,必须添加那个地方的sockaddr地址;同样,要能接受网络上的数据,必须有自己的sockaddr地址。
        可见,在网络上传送的数据包,是socket和sockaddr共同“染指”的结果。他们共同封装和指定了一个数据包的网络协议(IP)和IP地址,传输协议(TCP/UDP)和端口号。

网络字节和本机字节的相互转换

        sockaddr结构中的IP地址(sin_addr.s_addr)和端口号(sin_port)将被封装到网络上传送的数据包中,所以,它的结构形式需要保证是网络字节形式。我们这里用到的函数是htons()和htonl(),这些缩写的意思是:
h: host,主机(本机)
n: network,网络
to: to转换
s: short,16位(2字节,常用于端口号)
l: long, 32位(4字节,常用于IP地址)
“反过来”的函数也是存在的ntohs()和ntohl()。

动作与持续行为

        本节最后的一个概念可以跟计算机无关。作为动词,有些可以描述动作,有些是描述一重持续的行为状态的(就如同一般动词和be动词一样)。扯到C++来说,我们可以把持续行为封装到函数内部,只留出动作的接口。事实上,构造函数中的bind()和listen()就是这种描述持续状态的行为函数。

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

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

相关文章

地质灾害风险评价中按字段进行编号

示例 代码 # -*- coding: utf-8 -*- A1 B1 C1 D1 def a(name):namename.encode(utf-8);global A,B,C,Dif(name极高危险区):end"Ⅰ"str(A)AA1elif(name高危险区):end"Ⅱ"str(B)BB1elif(name中危险区):end"Ⅲ"str(C)CC1elif(name低危险区):end&qu…

vm虚拟机安装lede旁路由_教你利用VMM虚拟机安装LEDE旁路由实现软路由超强功能的方法教程...

教你利用VMM虚拟机安装LEDE旁路由实现软路由超强功能的方法教程6 H* ]: {$ Y2 f. W! o" u/ G& M9 p( d原文作者&#xff1a;阿文菌# [2 w0 p, K; H9 s$ ~6 |& }4 ]6 | y/ W$ A& d# n; x- K5 ~大家好俺又来了&#xff01;: ]2 f% S1 W7 D% l2 y俺现在家里24小时…

arcgis字段计算器VB脚本提取字符串

从左往右提取 left&#xff08;字段名称&#xff0c;提取长度&#xff09; Left( [地貌类型区],5) 从右往左提取 right&#xff08;字段名称&#xff0c;提取长度&#xff09; Right( [地理位置_1],3)

android学习笔记:数据库存储

使用的是SQLite 1.建立SQLiteOpenHelper扩展类。 public class DictionaryOpenHelper extends SQLiteOpenHelper {private static final int DATABASE_VERSION 2;private static final String DICTIONARY_TABLE_NAME "dictionary";private static final String DIC…

python允许无止境的循环吗_Python第一天 - 思想永无止境的个人页面 - OSCHINA - 中文开源技术交流社区...

下载安装python以及相关软件。python直接到python官网下windows-msi文件&#xff0c;版本根据需要下2.7或3.0。pydev自己网上搜&#xff0c;pydev官网的反而不行(eclipse上安装失败)。javaoracle官网eclipseeclipse官网配置pydev新建一个Python Interpreter&#xff0c;选择pyt…

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

前面一小节&#xff0c;我们已经写出了TcpServer的构造函数。这个函数的实际作用&#xff0c;就是创建了listen socket&#xff08;监听嵌套字&#xff09;。这一节&#xff0c;我们来具体分析这个创建的过程。socket和sockaddr的创建是可以相互独立的在函数中&#xff0c;我们…

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;…