今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习:

什么是socket:
在学习套接口之前,先要回顾一下Tcp/Ip四层模型:
而在说明什么是Socket之前,需要理解下面这些图:
而实际上:
所以:
另外:
这跟管道是不同的,管道只能用于本机的进程间通信。另外socket能用于异构系统间进行通信:
IPv4套接口地址结构:
一般不用
为什么要有地址家族呢?因为Socket不仅仅只能用于Tcp/Ip协议,还能用于其它协议,如:Unix域协议,所以一定得指名是哪个家族,如果是IPv4协议,则需要指定为AF_INET,如果是AF_INET6,则就是IPv6协议,这个用得很少~
16位的无符号整数,也就是两个字节,它能表示的最大的整数为:65535
对于IPv4协议,地址是32位的,也就是四个字节,所以该结构体为无符号的32位整数:
 
实际上,也可以通过man帮助来看到其结构:man 7 ip
 
【注意】:平常编程时,只会用到sa_family_t、in_port_t、struct in_addr这三个字段。
 
通用地址结构:
该字段总共有14个字节,实际上跟sockaddr_in最后面三个字段的总和是一样大小的:
所以说,通用的地址结构可以兼容IPv4的结构
 
为什么要有通用地址结构呢? 原因在于Socket不仅仅只能用于Tcp/Ip编程,它还能够用于Unix域协议编程,不同的协议地址结构形式可能有不一样的地方,所以说,这里存在一个统一形式的地址结构,可以用于所有的协议编程。
【提示】:实际编程中,通常是填充sockaddr_in地址结构,最终再强制转换成通用的sockaddr地址结构。
网络字节序:
实际上,刚才在查看man帮助时,就出现过这个概念,如:
所以下面来认识一下它:
关于上面的概念,可能有些抽象,下面用图来说明一下:
为什么要引入字节序这样一个概念呢?
这是因为Socket可以用于异构系统之间的通讯,不同的硬件平台,对于一个整数,存放形式是不一样的,有的机器是采用的大端字节序,有的则采用的小端,如果传给对等方可能解析出来的数字就会不一样了,这时就必须统一字节序,这个字节序就叫做“网络字节序”,所以可以看下面介绍。
 
这里指的就是本机中的实际字节序,下面可以编写一个小小的程序来验证一下我们的机器是什么字节序,如下:
编译运行:
 
 
 
字节序转换函数:
下面来用代码来说明一下:
编译运行:
 
地址转换函数:
为什么要有地址转换函数呢?因为我们平常人为认识的地址并不是32的数字,我们比较习惯的地址类似于这样:"192.168.0.100",而我们编程的时候,更多的是用的32的数字,所以需要引入地址转换函数,如下:
这个函数的功能跟下面这个函数的功能一样,都是将用户识别的地址转换成网络字节序,将存放在inp这个结构体中,第二个参数是一个输出参数。
将用户识别的类似于"192.168.0.100"这样的地址转换成32位的整数,下面用代码来看一下效果:
编译运行:
 
将32位的网络字节序转换成我们能识别的ip形式的地址:
编译运行:
 
套接字类型:
对于TCP/IP协议而言,就是tcp协议,如果是其它协议而言那就不一定了。
 
它提供了一种能力,让我们跨越传输层,直接对ip层进行数据封装的套接字,通过原始套接字,我们可以将应用层的数据直接封装成ip层能够认识的协议格式,关于原始套接字的编程之后再来学。
好了,关于Socket编码的初步先学到这,下次继续~

linux网络编程之socket编程(一)的更多相关文章

  1. linux网络编程之socket编程(四)

    经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...

  2. linux网络编程之socket编程(六)

    经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...

  3. linux网络编程之socket编程(八)

    学习socket编程继续,今天要学习的内容如下: 先来简单介绍一下这五种模型分别是哪些,偏理论,有个大致的印象就成,做个对比,因为最终只会研究一个I/O模型,也是经常会用到的, 阻塞I/O: 先用一个 ...

  4. linux网络编程之socket编程(十六)

    继续学习socket编程,今天的内容会有些难以理解,一步步来分解,也就不难了,正入正题: 实际上sockpair有点像之前linux系统编程中学习的pipe匿名管道,匿名管道它是半双工的,只能用于亲缘 ...

  5. linux网络编程之socket编程(十五)

    今天继续学习socket编程,这次主要是学习UNIX域协议相关的知识,下面开始: [有个大概的认识,它是来干嘛的] ①.UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍. ...

  6. linux网络编程之socket编程(三)

    今天继续对socket编程进行学习,在学习之前,需要回顾一下上一篇中编写的回射客户/服务器程序(http://www.cnblogs.com/webor2006/p/3923254.html),因为今 ...

  7. linux网络编程之socket编程(二)

    今天继续对socket编程进行研究,这里会真正开如用socket写一个小例子,进入正题: TCP客户/服务器模型:   关于这个模型的流程这里就不多说了,比较容易理解,下面则利用这种模型来编写一个实际 ...

  8. linux网络编程之socket编程(十二)

    今天继续学习socket编程,期待的APEC会议终于在京召开了,听说昨晚鸟巢那灯火通明,遍地礼花,有点08年奥运会的架势,有种冲动想去瞅见一下习大大的真容,"伟大的祖国,我爱你~~~&quo ...

  9. linux网络编程之socket编程(十一)

    今天继续学习socket编程,这次主要是学习超时方法的封装,内容如下: ①.alarm[不常用,了解既可] 它的实现思路是这样的: 但是这种方案有一定的问题,因为闹钟可能会作为其它的用途,这时所设置的 ...

随机推荐

  1. [LeetCode] 445. Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  2. 【VS开发】MFC学习之 解决StretchBlt()图片缩放绘图失真

    vc中位图伸缩函数StretchBlt在对图片进行缩放时会造成严重的图片失真.在了解解决方法前先巩固下StretchBlt的用法: StretchBlt 函数功能:函数从源矩形中复制一个位图到目标矩形 ...

  3. ZooKeeper的工作原理

     ZooKeeper是一个分布式的应用程序协调服务.   2 ZooKeeper的工作原理 Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步.实现这个机制的协议叫做Zab ...

  4. centos7安装php7.3

    安装php7.3 CentOS/RHEL 7.x: yum install epel-release yum install http://rpms.remirepo.net/enterprise/r ...

  5. Word样式教程

    目录 写在前面 样式可以解决什么问题? 本文适合于 快速入门 一切皆样式 样式与格式的关系 如何修改样式 建立新的样式 样式的匹配和更新 根据样式更新所选段落 根据所选段落更新样式 小结 进一步了解 ...

  6. ListModelSerializer模块

    ListModelSerializer模块 一 .自定义反序列化字段 # 一些只参与反序列化的字段,但是不是与数据库关联的 # 在序列化类中规定,并在校验字段时从校验的参数字典中剔除 class Pu ...

  7. linux shell程序常用功能

    一.循环读取文件 循环读取文件方式有多种,推荐下列方法 while read line;do local include=$(echo ${line} | grep "filter" ...

  8. INNODB 统计信息采集

    SHOW GLOBAL VARIABLES LIKE 'INNODB_STATS_PERSISTENT_SAMPLE_PAGES'; ALTER TABLE TABLE_NAME STATS_SAMP ...

  9. ThreadPoolExecutor使用错误导致死锁

    背景 10月2号凌晨12:08收到报警,所有请求失败,处于完全不可用状态 应用服务器共四台resin,resin之前由四台nginx做负载均衡 服务器现象及故障恢复步骤 登入服务器,观察resin进程 ...

  10. Centos7 在线安装开发环境 jdk1.8+mysql+tomcat

    写在最前 刚刚开始接触Linux,并折腾着在服务器上部署自己的项目,当然作为一个后端开发人员,必不可少的东西肯定是 JDK Mysql Tomcat容器 每天记录一天,每天进步一点点~~ 1.更新系统 ...