Linux 下的套接字编程

C/S 模型

  大多数跨进程的通信使用 C/S (客户端 / 服务器) 模型.

  在客户端和服务器端建立连接的系统调用并不相同,但是都用到了相同的结构 socket(套接字).
  套接字是跨进程通信通道的一段,两个进程连接开始时都会初始化他们的套接字.

  客户端建立套接字的步骤如下

  • 使用 socket() 系统调用建立套接字
  • 使用 connect() 系统调用将套接字连接到服务器端的地址上
  • 发送并且接受消息,有很多中方式可以做到,最简单的方式是使用 read()write() 系统调用

  服务器端建立套接字的步骤如下

  • 使用 socket() 系统调用创建套接字
  • 使用 bind)() 系统调用将套接字绑定到一个地址上,对于服务器端,这个地址包含端口号
  • 使用 listen() 系统调用监听连接
  • 使用 accpet() 系统调用接受连接请求.这个调用会堵塞直到客户端与服务器建立连接为止
  • 发送和接受消息

套接字类型

  当套接字建立后,程序必须指定地址域(address domain)和套接字类型(socket type), 两个进程只有当他们的套接字的地址域和套接字类型都相同时才能通信.

地址域

  目前有两种广泛使用的地址域

  • UNIX 域套接字
    两个进程共享一个普通文件用于通信
  • 网际网络网域
    两个运行在不同主机上的进程通过互联网进行通信

  以上两个地址域都有其独自的地址格式

  UNIX 域套接字的地址是一个字符串,它通常对应于文件系统的中的一个实体.
  Internet 域套接字域名包含主机在互联网中的 IP 地址和端口号.

套接字类型

  目前有两种广泛使用的套接字类型,流套接字(stream socket)和数据包套接字(datagram socket).
  数据包套接字将通信发送的数据视为连续不间断的字节,而数据包套接字一次读取整个信息.

  流套接字使用 TCP(Transmission Control Protocl) 协议,TCP 是可靠的,面向流的通信协议.
  数据包套接字使用 UDP(Unix Datagram Protocol), UDP 是不可靠的,面向数据包的协议.