网络编程套接字


一、套接字

IP地址和端口号

IP地址主要负责的是把数据从一台主机硬件传送到另一台主机硬件,它标识的是操作系统或者是服务器本身的唯一性。

当我们把数据送到目标主机时,只是把数据送到了这台机器,这台机器上有许多运行的软件服务,那么此时该数据包该给哪个软件呢?

因此,网络通信中,除了要用IP地址确认目标主机以外,还要通过某种方式去标定该主机上的特定的一个进程!
把标定进程的方式叫做端口号

在前面学习中,进程标识符pid表示唯一的一个进程,而此处的端口号也是唯一表示一个进程。那么它们之间有什么关系呢?

  • 所有的进程不一定都是网络进程,因此不是所有的进程都需要端口号。

  • 但所有的进程在系统层面上都要被管理,因此要有唯一编号。

  • pid是每个进程都必须得有的,当该进程是网络进程时,才需要给它指派端口号。

套接字

  • IP:标定全公网内唯一一台主机
  • 端口号port:标定特定一台主机内的唯一一个进程
  • IP+端口号:标记的是全网内唯一的一个进程

IP+端口号叫做套接字socket

网络通信

所谓的通信本质上是两个进程在进行通信,因此,套接字通信的本质是进程间通信。
在这里插入图片描述

之前学习的进程间通信,只能在本主机内,在一台机器上进行;而套接字是可以跨网络的。
实现通信要求看到同一份资源,客户端和服务器能看到的公共资源是(计算机)网络。

二、网络字节序

由于通信双方采用的字节序不同,因此,TCP/IP协议规定,在网络传输的数据流统一采用大端字节序。
如果当前发送主机是小端,就需要先将数据转成大端再发送。

三、TCP协议与UDP协议(简要)

TCP

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

UDP

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

四、socket编程

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
  • type:创建套接字的类型,有三种:
    1、面向字节流(流式服务套接字)——TCP
    2、用户数据报套接字 —— UDP
    3、原始套接字
  • 返回值:成功时,返回的是文件描述符
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
  • struct sockaddr* address:是要给sokect绑定的IP和端口号,需要定义一个结构体来保存IP地址和端口号。
    address_len:对应传入sockaddr的长度

sockaddr结构


这样设计的好处:
只需要一套接口,就可以完成多种通信。


TCP双方为了维护链接,是要有成本的(时间和空间),UDP不用建立链接,因此会快一点。

CS模型:服务器—被动接受链接,客户端—主动发起请求。

  • 文件描述符如何和套接字产生关联?

创建套接字时,在内核中会创建一个struct socket,内含* file 和 sock * sk

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值