linux网络编程之socket编程(十五)
今天继续学习socket编程,这次主要是学习UNIX域协议相关的知识,下面开始:
【有个大概的认识,它是来干嘛的】
①、UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。
UNIX域协议主要是用于本地的进程间进行通讯,而TCP的套接字不仅可以用于本地的进程间进行通讯,还可用于两台不同主机上面进程间进行通讯,如果都是用于本地的进程间通讯的话,UNIX域协议比TCP协议效率来得高。
②、UNIX域套接字可以在同一台主机上各进程之间传递描述符。
也就是可以传递一个文件,关于这个知识下一次再学习,稍复杂一些~
③、UNIX域套接字与传统套接字的区别是用路径名来表示协议族的描述。
而对于之前我们用的网际的IPV4的地址结构是sockaddr_in,如下:
其实结构都差不多,下面,用代码来用UNIX域协议来实现回射客户/服务程序。
服务端echosrv.c:
首先创建一个监听套接口:
在TCP编程中,在正式绑定监听套接字之前是需要设备地址重复利用的,如下:
而对于UNIX域套接字而言,这一步就不用了,这是与TCP协议不同的,下面则开始绑定:
接下来则进行监听:
其中SOMAXCONN是最大连接,可以从listen的man帮助中找到:
下面则处理客户端发过来的请求,这里简单起见,就用fork进程的方式来处理多个客户端,而不用select方式处理并发了:
下面来处理客户端的连接:
另外注意:这里需要引入一个新的头文件:
下面来编写客户端echocli.c:
首先也是创业套接口:
接着连接服务器:
当连接成功之后,就执行回射客户端的函数:
具体实现基本跟TCP的类似,也比较容易理解:
下面开始编译运行:
这也就说明了这句代码的意义,是在bind的时候产生该文件的:
靠这个文件实现两者的互通,来观察一下它的类型:
其中可以通过命令来查看linux下的文件类型,其中就有一个套接字文件:
下面开始运行:
但是有一个问题,如果我再重新运行服务端:
如何解决这个问题呢,对于TCP来说可以设置地址重复利用既可,但是对于UNIX域协议来说,可以在重新启动服务端时,将这个路径文件删除既可:
以就是就是UNIX域协议套接字编程的实现,其实比较简单,下面来看一下它的一些注意点。
①、bind成功将会创建一个文件,权限为0777 & ~umask
下面来看一下产生的套接字的文件的权限:
而当前的umask为:
755=0777 & (~0022)
②、sun_path最好用一个绝对路径
如果用相对路径会出现什么样的问题呢?下面来做个实验,就是将客户端与服务器程序放到不同的目录里面:
下面来运行一下:
所以,为了避免当客户端与服务端程序在不同目录上的问题,可以将文件路径改为绝对的,这里将此文件放到tmp目录中,如下:
下面编译之后,再将客户端程序拷贝到上级目录中,让它与服务端不在同一个目录,如下:
③、UNIX域协议支持流式套接口与报式套接口
基于流式的套接口是需要处理粘包问题,实际上上面写的程序是没有处理粘包问题的,实现思路跟TCP的一样,这里就不演示了;如果是报式套接口就不存在粘包问题。
④、UNIX域流式套接字connect发现监听队列满时,会立刻返回一个ECONNREFUSED,这和TCP不同,如果监听队列满,会忽略到来的SYN,这导致对方重传SYN
好了,今天先学到这,下节见~
linux网络编程之socket编程(十五)的更多相关文章
- linux网络编程之socket编程(十六)
继续学习socket编程,今天的内容会有些难以理解,一步步来分解,也就不难了,正入正题: 实际上sockpair有点像之前linux系统编程中学习的pipe匿名管道,匿名管道它是半双工的,只能用于亲缘 ...
- linux网络编程之socket编程(十二)
今天继续学习socket编程,期待的APEC会议终于在京召开了,听说昨晚鸟巢那灯火通明,遍地礼花,有点08年奥运会的架势,有种冲动想去瞅见一下习大大的真容,"伟大的祖国,我爱你~~~&quo ...
- linux网络编程之socket编程(十)
今天继续socket编程的学习,最近晚上睡觉都没有发热,没有暖气的日子还是种煎熬,快乐的十一也已经走来,幸福有暖气的日子也快啦,好了,回到正题~ ①close终止了数据传送的两个方向. ②shutdo ...
- linux网络编程之socket编程(十四)
经过令国鸡冻的APEC会之后,北京的冬天终于不冷了,有暖气的日子就是倍儿爽呀~~洗完热水澡,舒服的躺在床上欢乐地敲打着键盘,是件多么幸福的事呀,好了,抒发情感后,正题继续. 上节中已经初步学习了UDP ...
- linux网络编程之socket编程(六)
经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...
- linux网络编程之socket编程(四)
经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...
- linux网络编程之socket编程(一)
今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp ...
- linux网络编程之socket编程(八)
学习socket编程继续,今天要学习的内容如下: 先来简单介绍一下这五种模型分别是哪些,偏理论,有个大致的印象就成,做个对比,因为最终只会研究一个I/O模型,也是经常会用到的, 阻塞I/O: 先用一个 ...
- linux网络编程之socket编程(七)
今天继续学习socket编程,北京在持续几天的雾霾天之后久违的太阳终于出来了,心情也特别特别的好,于是乎,在这美好的夜晚,该干点啥事吧,那当然就是继续坚持我的程序学习喽,闲话不多说,进入正题: 通过这 ...
随机推荐
- JSON Hijacking漏洞
https://github.com/SkyLined/LocalNetworkScanner JS.利用浏览器漏洞当对方打开网址时,扫描对方内网信息 https://www.freebuf.com/ ...
- 【GStreamer开发】GStreamer播放教程07——自定义playbin2的sink
目标 通过手动选择音频和视频的sink,playbin2可以进一步定制.这允许使用playbin2的应用在解码后可以自行做最终的渲染和显示.本教程展示了: 如何替换playbin2选择的sink 如何 ...
- Andrew Ng机器学习课程7
回顾 通过定义训练集S={(x(i),y(i));i=1,2,...,m}与线性决策平面(w,b)之间的function margin γ^和geometric margin γ .好的分类决策平面特 ...
- ztree节点名称排序
// result 为后台返回的集合,在渲染tree前的数据 result = result.sort(function (a, b) { // 判断前面一个是字母,后面一个不是字母,那么不换位置,返 ...
- windows下安装JDK1.8和eclipse
JVM的执行过程: 加载.class文件->管理并分配内存->执行垃圾收集 1.JDK下载和安装 JDK是面向开发人员使用的SDK,提供了java的开发环境和运行环境,SDK是Softwa ...
- python线程队列Queue-FIFO(35)
之前的文章中讲解很多关于线程间通信的知识,比如:线程互斥锁lock,线程事件event,线程条件变量condition 等等,这些都是在开发中经常使用的内容,而今天继续给大家讲解一个更重要的知识点 — ...
- .net core中关于System.Text.Json的使用
在.Net Framework的时候序列化经常使用Newtonsoft.Json插件来使用,而在.Net Core中自带了System.Text.Json,号称性能更好,今天抽空就来捣鼓一下. 使用起 ...
- [.Net] - 使用 iTextSharp 生成基于模板的 PDF,生成新文件并保留表单域
背景 基于 PDF Template 预填充表单项,生成一份新的 PDF 文件,并保留表单域允许继续修改. 代码段 using iTextSharp.text.pdf; /* Code Snippet ...
- Python之算法评估-4
一.评估算法的方式分两种,一种是分类算法的评估,一种是回归算法的评估.为什么要分两种呢,因为分类算法中可以通过准确率.精准率.召回率.混淆矩阵.AUC来评估算法的准确度.但是在预测值的时候是没有办法去 ...
- core直接获取报异常数据
报异常直接跳转到/Home/Error [ResponseCache(Duration = , Location = ResponseCacheLocation.None, NoStore = tru ...