今天继续学习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编程(十五)的更多相关文章

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

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

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

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

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

    今天继续socket编程的学习,最近晚上睡觉都没有发热,没有暖气的日子还是种煎熬,快乐的十一也已经走来,幸福有暖气的日子也快啦,好了,回到正题~ ①close终止了数据传送的两个方向. ②shutdo ...

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

    经过令国鸡冻的APEC会之后,北京的冬天终于不冷了,有暖气的日子就是倍儿爽呀~~洗完热水澡,舒服的躺在床上欢乐地敲打着键盘,是件多么幸福的事呀,好了,抒发情感后,正题继续. 上节中已经初步学习了UDP ...

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

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

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

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

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

    今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp ...

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

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

  9. linux网络编程之socket编程(七)

    今天继续学习socket编程,北京在持续几天的雾霾天之后久违的太阳终于出来了,心情也特别特别的好,于是乎,在这美好的夜晚,该干点啥事吧,那当然就是继续坚持我的程序学习喽,闲话不多说,进入正题: 通过这 ...

随机推荐

  1. Nginx虚拟目录(alias)和根目录(root)

    功能要求: 假设nginx配置的域名是www.kazihuo.com,现有静态资源/home/www/oye目录需要通过nginx访问. 功能实现: 前提要求: 1.在nginx.conf中到处第二行 ...

  2. Vue + ElementUI的电商管理系统实例01 登录表单

    效果图: 1.首先来根据Element网站实现布局: <template> <div class="login_container"> <div cl ...

  3. nnexus3 破解密码

    主要步骤如下: 1.停服 2.进入OrientDB控制台:java -jar /usr/local/nexus/lib/support/nexus-orient-console.jar 3.在控制台执 ...

  4. 高性能最终一致性框架Ray之基本功能篇

    一.Event(事件) Event是Actor产生的记录状态变化的日志,由StateId(状态Id),UID(幂等性控制),TypeCode(事件类型),Data(事件数据),Version(事件版本 ...

  5. Linux下安装redis以及常用命令

    https://blog.csdn.net/zgf19930504/article/details/51850594 安装: 1.获取redis资源 wget http://download.redi ...

  6. Linux DHCP 服务器配置与管理

    一.环境介绍: 运行软件:VMware Workstation Pro 14 系统环境:CentOS-7-x86_64-1810 二.操作配置: 1.DHCP 服务器搭建 1)安装DHCP yum i ...

  7. 原生js 实现better-scroll效果,饿了么菜单内容联动,即粘即用

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. Struts笔记2

    Struts2-配置文件result元素 作用:为动作指定结果视图 name属性:逻辑视图的名称,对应着动作方法的返回值.默认值是success type属性:结果类型,指的就是用什么方式转到定义的页 ...

  9. Windows10+Anaconda+PyTorch(cpu版本)环境搭建

    1.安装Anaconda,具体参考网上相关教程 2.安装PyTorch 2.1 在Anaconda自带的Anaconda Prompt中创建名为PyTorch的虚拟环境[conda create -- ...

  10. dede5.7-修改自定义表单

    最近刚好帮客户做一个网站,需要用到dede的自定义表单功能.可是有个这样的需求,就是当表单提交成功后,要返回一个自定义页面的提示功能!可能是觉得dede自带的提示太low的原因吧!(一不小心又黑了下)