今天开始,继续来学习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. 解决Python查询Mysql数据库信息乱码问题

    今天尝试着用 Python 写了个脚本试着连接 mysql 数据库,并查询里边的数据,不过最终查询结果中文字符变成了ascii格式. 代码如下: #!/usr/bin/python #encoding ...

  2. 【Python学习之十】操作数据库

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 操作mysql数据库 1.安装pymysql模块p ...

  3. window10 phpstudy2018 mysql服务重启之后自动停止

    使用phpstudy集成环境开发php,但是可能版本太旧,导致有些语法用不了.所以决定删掉,再下一个新版的. 把phpstudy退出之后,就直接把phpstudy文件夹删除了.发现它并不能删除成功.然 ...

  4. 高级UI-自定义控件

    自定义控件在Android开发中有着大量的运用,为了做出符合项目的效果很多时候需要自定义控件,这里就使用两个自定义控件,来说明自定义控件的使用流程 仿QQ侧滑 之前使用DrawerLayout和Nav ...

  5. Spring的日志管理

    一.spring的日志依赖 Logging是spring中唯一强制的外部依赖,spring中默认使用的日志是commons-logging,简称JCL,这里说的强制性,是因为在spring-core这 ...

  6. pyhton数据类型:字典、集合、列表、元组

    基本常识 元组 列表 字典 集合 初始化 tuple=(1,2,3,4) list=[1,2,3,4] dic={'a':12,'b':34} set={1,2,3,4} 元素索引 tuple[0] ...

  7. [转帖]Xshell改字体,改大小,改快捷键方法

    Xshell改字体,改大小,改快捷键方法 -- :: Jason Ho 阅读数 62更多 分类专栏: Software 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附 ...

  8. 使用flask做网页的excel成绩分析

    使用到的技术:pyecharts flask 首先 pip install flask 和下载pip install pyecharts==0.5.5 项目结构: 代码: from flask imp ...

  9. CSS中position和float的使用

    近期会更新一系列博客,对基础知识再度做个巩固和梳理. 一.position定位 (一):position的属性 1.absolute:生成绝对定位的元素,相对于最近一级定位不是static的父元素来进 ...

  10. Python-10-迭代器

    一.定义 1. 迭代的概念 迭代器即迭代的工具,那什么是迭代呢?迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭 ...