Linux进程间通信(IPC) ---- 套接字

目录

一、什么是套接字?

二、如何通过套接字来维持一个连接的?

三、套接字属性

四、创建套接字

五、关于套接字的其它系统调用


进程间通信的方式有:管道、套接字、共享内存、消息对列、信号量

管道,信号量,共享内存见之前博客。


套接字:是管道概念的一个扩展,Linux系统支持套接字接口。可以通过使用管道类似的方法来使用套接字,套接字还包括计算机网络中的通信,常用于网络编程。

Windows系统的套接字服务是由系统文件winsock.dll来提供。

  •      套接字连接的工作原理
  •      套接字的属性、地址和通信
  •      网络信息和互联网守护进程
  •      客户和服务器

一、什么是套接字?

套接字是一种通信机制。凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。Linux所提供的功能和网络工具通常都是通过套接字来进行通信的。

套接字机制可以实现将多个客户连接到一个服务器。

 

二、如何通过套接字来维持一个连接的?

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

接下来,服务器进程会给套接字起个名字。本地套接字的名字是Linux文件系统中的文件名,一般放在/tmp或/usr/tmp目录中。对于网络套接字,它的名字是与客户连接的特定网络有关的服务标识符(端口号或访问点),这个标识符允许Linux将进入的针对特定端口号的连接转到正确的服务器进程。

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

Listen的作用是,创建一个队列并将其用于存放来自客户的进程连接。、

服务器通过系统调用accept来接受客户的连接。

服务器调用accept时,它会创建一个与原有的命名套接字不同的新的套接字,这个新套接字只用来与这个特定的客户进行通信,而命名套接字则被保留下来继续处理来自其他客户的连接。

客户端:首先调用socket创建一个未命名套接字,然后将服务器的命名套接字作为一个地址来调用connect与服务器建立连接。

连接建立好,可以实现双向的数据通信

查看套接字文件:ls -lF  ps lx

 

三、套接字属性

域(domin)、类型(type)和协议(protocol)。套接字还用地址作为它的名字。地址的格式随域(协议族,protocol family)的不同而不同。每个协议族又可以使用一个或多个地址族来定义地址格式。

1)域

    域指定套接字通信中使用的网络介质。最常见AF_INET,它指的是Internet网络。其底层协议-网际协议(IP)只有一个地址族,它使用IP地址来指定计算机中的网络。域名都会被转换为底层的IP地址

    IP端口可以用来指定一台服务器计算机上的某个特定服务。在系统内部,端口通过一个唯一的16位整数来标识。在系统外部,IP地址和端口号来一起确定。

   套接字作为通信的终点,它必须在开始终点之前绑定一个端口。

2)套接字类型

    因特网协议提供了两种通信机制:流(stream)和数据报(datagram)。

  • 流式套接字

在某些方面类似于标准的输入/出流,提供的是有序、可靠、双向字节流的连接。可以确保发送的数据不会丢失,赋值或者乱序到达。大的消息会被分片、传输、再重组。

流套接字由SOCK_STREAM指定,在TCP/IP连接实现

  • 数据报套接字

由SOCK_DGRAM指定,数据报套接字不建立连接。对发送的数据报的长度有限制。它作为一个单独的网络消息被传输,存在丢失、复制或乱序到达。由UDP/IP连接实现,提供无序的不可靠的服务。

3)套接字协议

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

 

四、创建套接字

1.socket系统调用创建一个套接字并返回一个描述符,该描述符可以用来访问该套接字。

#include<sys/types.h>
#include<sys/socket.h>

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

domain参数指定协议族,type参数指定套接字的通信类型,protocol指定使用的协议。

  • domain可以指定的协议族常用的有AF_UNIX 和 AF_INET。AF_UNIX用于通过UNIX和Linux文件系统实现本地套接字,或者用于UNIX网络套接字。AF_INET套接字可以用于TCP/IP网络进行通信的程序。Windows下的Winsock接口也提供了对套接字的访问功能。
  • type的取值包括SOCK_STREAM和SOCK_DGRAM。SOCK_STREAM是一个有序、可靠、面向连接的双向字节流。对于AF_INET域套接字来说,它是依靠TCP连接来提供这一特性,TCP连接在两个流套接字之间建立。SOCK_DGRA是数据报服务。我们可以用它来发送最大长度固定的消息,但是它不保证可靠性,对于AF_INET域套接字来说,它是依靠UDP连接来提供这一特性。
  • protocol通常设为0,表示使用默认协议。

socket系统调用返回的是一个描述符,类似于底层的文件描述符。当两个套接字建立起连接之后,就可以使用read和write系统调用来通过这个描述符在套接字上发送和接收数据。

close系统调用用于关闭连接,关闭之后系统会回收之前被占用的描述符。

五、关于套接字的其它系统调用

bind、listen、accept、connect这些都是基于TCP连接的,基本网络编程时用到的系统调用,等到后面有时间写到了再详解呦!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值