位置: 编程技术 - 正文

Linux进程间通信——使用流套接字

编辑:rootadmin

推荐整理分享Linux进程间通信——使用流套接字,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程。通常我们使用socket进行网络编程,这里将会简单地讲述如何使用socket进行简单的网络编程。

一、什么是socket

socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来。

二、套接字的属性

套接字的特性由3个属性确定,它们分别是:域、类型和协议。

1、套接字的域

它指定套接字通信中使用的网络介质,最常见的套接字域是AF_INET,它指的是Internet网络。当客户使用套接字进行跨网络的连接时,它就需要用到服务器计算机的IP地址和端口来指定一台联网机器上的某个特定服务,所以在使用socket作为通信的终点,服务器应用程序必须在开始通信之前绑定一个端口,服务器在指定的端口等待客户的连接。另一个域AF_UNIX表示UNIX文件系统,它就是文件输入/输出,而它的地址就是文件名。

2、套接字类型

因特网提供了两种通信机制:流(stream)和数据报(datagram),因而套接字的类型也就分为流套接字和数据报套接字。这里主要讲流套接字。

流套接字由类型SOCK_STREAM指定,它们是在AF_INET域中通过TCP/IP连接实现,同时也是AF_UNIX中常用的套接字类型。流套接字提供的是一个有序、可靠、双向字节流的连接,因此发送的数据可以确保不会丢失、重复或乱序到达,而且它还有一定的出错后重新发送的机制。

与流套接字相对的是由类型SOCK_DGRAM指定的数据报套接字,它不需要建立连接和维持一个连接,它们在AF_INET中通常是通过UDP/IP协议实现的。它对可以发送的数据的长度有限制,数据报作为一个单独的网络消息被传输,它可能会丢失、复制或错乱到达,UDP不是一个可靠的协议,但是它的速度比较高,因为它并一需要总是要建立和维持一个连接。

3、套接字协议

只要底层的传输机制允许不止一个协议来提供要求的套接字类型,我们就可以为套接字选择一个特定的协议。通常只需要使用默认值。

三、套接字地址

每个套接字都有其自己的地址格式,对于AF_UNIX域套接字来说,它的地址由结构sockaddr_un来描述,该结构定义在头文件sys/un.h中,它的定义如下:

对于AF_INET域套接字来说,它的地址结构由sockaddr_in来描述,它至少包括以下几个成员:

而in_addr被定义为:

四、基于流套接字的客户/服务器的工作流程

使用socket进行进程通信的进程采用的客户/服务器系统是如何工作的呢?

1、服务器端

首先服务器应用程序用系统调用socket来创建一个套接安,它是系统分配给该服务器进程的类似文件描述符的资源,它不能与其他的进程共享。

接下来,服务器进程会给套接字起个名字,我们使用系统调用bind来给套接字命名。然后服务器进程就开始等待客户连接到这个套接字。

然后,系统调用listen来创建一个队列并将其用于存放来自客户的进入连接。

最后,服务器通过系统调用accept来接受客户的连接。它会创建一个与原有的命名套接不同的新套接字,这个套接字只用于与这个特定客户端进行通信,而命名套接字(即原先的套接字)则被保留下来继续处理来自其他客户的连接。

2、客户端

基于socket的客户端比服务器端简单,同样,客户应用程序首先调用socket来创建一个未命名的套接字,然后将服务器的命名套接字作为一个地址来调用connect与服务器建立连接。

一旦连接建立,我们就可以像使用底层的文件描述符那样用套接字来实现双向数据的通信。

五、流式socket的接口及作用

socket的接口函数声明在头文件sys/types.h和sys/socket.h中。

Linux进程间通信——使用流套接字

1、创建套接字——socket系统调用

该函数用来创建一个套接字,并返回一个描述符,该描述符可以用来访问该套接字,它的原型如下:

int socket(int domain, int type, int protocol);

函数中的三个参数分别对应前面所说的三个套接字属性。protocol参数设置为0表示使用默认协议。

2、命名(绑定)套接字——bind系统调用

该函数把通过socket调用创建的套接字命名,从而让它可以被其他进程使用。对于AF_UNIX,调用该函数后套接字就会关联到一个文件系统路径名,对于AF_INET,则会关联到一个IP端口号。函数原型如下:

int bind( int socket, const struct sockaddr *address, size_t address_len);

成功时返回0,失败时返回-1;

3、创建套接字队列(监听)——listen系统调用

该函数用来创建一个队列来保存未处理的请求。成功时返回0,失败时返回-1,其原型如下:

int listen(int socket, int backlog);

backlog用于指定队列的长度,等待处理的进入连接的个数最多不能超过这个数字,否则往后的连接将被拒绝,导致客户的连接请求失败。调用后,程序一直会监听这个IP端口,如果有连接请求,就把它加入到这个队列中。

4、接受连接——accept系统调用

该系统调用用来等待客户建立对该套接字的连接。accept系统调用只有当客户程序试图连接到由socket参数指定的套接字上时才返回,也就是说,如果套接字队列中没有未处理的连接,accept将阻塞直到有客户建立连接为止。accept函数将创建一个新套接字来与该客户进行通信,并且返回新套接字的描述符,新套接字的类型和服务器监听套接字类型是一样的。它的原型如下:

int accept(int socket, struct sockaddr *address, size_t *address_len);

address为连接客户端的地址,参数address_len指定客户结构的长度,如果客户地址的长度超过这个值,它将会截断。

5、请求连接——connect系统调用

该系统调用用来让客户程序通过在一个未命名套接字和服务器监听套接字之间建立连接的方法来连接到服务器。它的原型如下:

int connect(int socket, const struct sockaddr *address, size_t address_len);

参数socket指定的套接字连接到参数addres指定的服务器套接字。成功时返回0,失败时返回-1.

6、关闭socket——close系统调用

该系统调用用来终止服务器和客户上的套接字连接,我们应该总是在连接的两端(服务器和客户)关闭套接字。

六、进程使用流式socket进行通信

下面用多个客户程序和一个服务器程序来展示进程间如何利用套接字进行通信。

sockserver.c是一个服务器程序,它首先创建套接字,然后绑定一个端口再监听套接字,忽略子进程的停止消息等,然后它进入循环,一直循环检查是否有客户连接到服务器,如果有,则调用fork创建一个子进程来处理请求。利用read系统调用来读取客户端发来的信息,利用write系统调用来向客户端发送信息。这个服务器的工作非常简单,就是把客户发过来的字符+1,再发送回给客户。

sockclient.c是一个客户程序,它同样要先创建套接,然后连接到指定IP端口服务器,如果连接成功,就用write来发送信息给服务器,再用read获取服务器处理后的信息,再输出。

服务器sockserver.c的源代码如下:

客户sockclient.c的源代码如下:

运行结果如下:

在本例子中,我们启动了一个服务器程序和三个客户程序,从运行的结果来看,客户端发送给服务器程序的所有请求都得到了处理,即把A变成了B。对于服务器和客户程序之间使用的read和write系统调用跟使用命名管道时阻塞的read、write系统调用一样。例如客户程序调用read时,如果服务器程序没有向指定的客户程序的socket中写入信息,则read调用会一直阻塞。

七、流式套接字给我印象

给我的感觉是流式套接字很像命名管道,但是它却可以使不在同一台计算机而通过网络连接的不同计算机上的进程进行通信,功能真是非常的强大。

标签: Linux进程间通信——使用流套接字

本文链接地址:https://www.jiuchutong.com/biancheng/376698.html 转载请保留说明!

上一篇:linux命令行批量创建目录详解(linux如何批量执行脚本)

下一篇:Linux启动新进程的几种方法及比较(linux系统启动进程命令)

  • 节能服务公司可以做什么
  • 服装加工费税收编码
  • 捐赠支出增值税
  • 所得税费用包括递延所得税吗
  • 收到营业外收入流水账怎么做账
  • 固定资产折旧准予扣除是什么意思
  • 机器维修费属于变动成本吗
  • 应付账款尾差怎么算
  • 租赁企业可以开具电费发票吗
  • 金税三期电子发票怎么领取
  • 上级拨入资金借方表示什么
  • 个税申报收入额怎么填
  • 个人到税务局开发票要带什么东西
  • 会计账簿按外表形式分
  • 公司会计怎么做
  • 以固定资产换入固定资产
  • 企业辅助生产车间
  • 非盈利组织的好处
  • 苗木发票抵扣公式
  • 上年度的印花税怎么计算
  • 耕地占用税如何申报缴纳
  • 个人取得上市公司股权
  • 地铁充值发票会透露个人账户信息吗
  • 收入可以用收据入账吗
  • 出售固定资产属于收入
  • 专票只能开一万的额度开了三万的发票
  • 退了货的发票还能用吗
  • 当收到转账支票时,应该如何处理?
  • Windows server 2008设置远程桌面连接的详细步骤(图文教程)
  • 进项税发票未认证
  • 本期填写的适用3减1政策的本期发生额大于
  • 开发票原则是收款之后才能开具吗
  • 生产车间工人发放福利
  • 生产型企业原材料运费入库单怎么填
  • apache运行php
  • 行政事业单位捐款支出怎么记账
  • php反射使用场景
  • 白兰花的养殖方法和注意事项和病虫害
  • Vue3+element-plus 后台管理系统(含登陆注册功能页面)
  • 马蹄莲的养殖方法和注意事项视频
  • 主播录屏软件哪个好
  • thinkphp开发框架
  • yii框架连接数据库
  • 增值税发票上多了一个点能刮掉吗
  • day14-HTTP01
  • db2 knowledge center
  • 不借助的英文
  • 织梦怎么用模板建站
  • 运费和什么有关
  • mysql数据类型和java对应
  • 营业总收入和营业利润
  • 当月销售次月开票怎么做账
  • 固定资产处置的账务处理 终于搞明白了!
  • 甲方向乙方支付
  • 新公司初期费用全部入哪里
  • 坏账准备具有什么功能
  • 预付账款主要是什么
  • 本月增加的固定资产本月可以进行部门转移
  • 公司卖土地怎么避税
  • 矿山运输设备的点检绩效考核
  • 如何看xp系统
  • windows vista可以换7吗
  • centos7(core)
  • 光盘pe系统
  • win10通讯设置在哪
  • centos6.5怎么安装
  • win8创建我的电脑
  • linux怎么修改主配置文件
  • win10系统安全中心在哪
  • win7怎么更改用户名和密码
  • 如何用bat批量删除文件
  • js出错
  • angular使用
  • jquery隐藏和显示div
  • mapper--图片热点区域高亮组件官方站点
  • qpython pydroid
  • 医保12333查询系统
  • 云南税务局网上办税大厅登录入口官网
  • 增值税专用发票增额需要什么资料
  • 杭州 国税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设