今天开始,继续来学习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. SVN 本地文件锁/服务端文件锁清除步骤

    1.本地文件锁,直接cleanup,cleanup界面选择break locks即可 2.服务端文件锁,本地文件右击没有release lock或者break lock的选项时 方法1:右键,svn选 ...

  2. (转)在高分辨率下eclipse,STS,等软件工具栏图标过小的问题方法总结

    背景:在高分辨率情况下,sts工具栏图标超小,肉眼看不清.按照方法二能够满足需求,开心 https://blog.csdn.net/u012687923/article/details/8032437 ...

  3. Jenkins插件、war下载地址

    1.jenkins的war包下载地址 地址:http://mirrors.jenkins-ci.org/,打开链接后,表格有war列,Releases行是短期更新包.LTS是长期更新包.一般选择Rel ...

  4. 探索免费开源服务器tomcat的魅力

    Tomcat最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发的.后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会,并且成为Jakarta 项目中的一个核心项目.因此逐渐成为世界上广 ...

  5. 小程序重置index,重置item

    重置index,重置item <block wx:for="{{index_data.banner_list}}" wx:for-index="idx" ...

  6. [转帖]关于一个 websocket 多节点分布式问题的头条前端面试题

    关于一个 websocket 多节点分布式问题的头条前端面试题 https://juejin.im/post/5dcb5372518825352f524614 你来说说 websocket 有什么用? ...

  7. java email发送(附件中文的处理)

    这里使用的是commons-email-1.3.2.jar进行的开发,自认为这是简单的邮件发送. package com.yt.base.common; import java.io.Unsuppor ...

  8. Java开发笔记(一百二十)AWT文本标签

    前面介绍了AWT窗口及其面板的简单用法,其中展示出来的控件只有按钮一种,还有很多好用好玩的控件有待介绍.首先是文本标签Label,该控件用于显示一段平铺文本,它不花哨也不跳动,完全就是素面朝天的文本字 ...

  9. vs中web api程序不包含适合于入口点的静态“Main”方法

    步骤:选择该项目的属性--应用程序--输出类型--类库

  10. 常用Tables控件介绍(三)

    向datagrid中添加临时记录: 代码: $(function(){ fun={ add:function(){ $.ajaxSettings.async=false; var rows=$('#d ...