Linux环境:C编程之网络通信

本文介绍了Linux环境中使用C语言进行网络通信的基础知识,包括TCP/IP参考模型、socket编程预备知识,如socket类型、地址转换、字节序等,并详细阐述了TCP和UDP通信协议的编程过程,包括socket函数、bind、listen、accept、connect、recv、send、recvfrom和sendto等关键函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络通信概述

计算机网络通信内容很多,这只是一个针对socket编程的基础知识概述总结

通信参考模型

互联网通信遵循一定的通信协议和通信机制,称为通信模型。
国际标准化的开放网络通信模型是OSI参考模型,但是OSI模型概念提出较晚,所以一直没有实现,只是停留在概念性的参考框架上。目前通用的模型为TCP/IP通信参考模型,以下主要介绍TCP/IP通信参考模型。

自顶向下的TCP/IP参考模型
应用层
  • 客户在应用层使用各种应用和协议进行通信,应用层实现了应用到应用之间的通信,即进程与进程之间的通信,通过端口识别不同的进程。
  • 常用的应用层协议包括http 超文本传输协议ftp 文件传输协议telnet 远程登录ssh 安全外壳协议stmp 简单邮件发送协议pop3 邮件收发协议。应用层程序员可以通过编程实现自己的通信协议。
  • 应用层的通信协议规定了用户传输的数据信息的格式,并附加了相关的格式控制信息等,称为报文
    • 应用层的报文传输由传输层实现。
传输层
  • 传输层负责实现端到端通信,即主机到主机之间的通信,源主机ip到目标主机ip
  • 传输层把应用层的报文按照大小划分为报文段并附加传输层协议的格式控制信息
  • 报文段由传输层交付网络层传输。
  • 传输层从协议主要是TCP协议和UDP协议
  • TCP协议通过三次握手(-- 在吗?-- 我在,你在吗?-- 我也在,我们开始吧),四次挥手(–我要走了 – 好的我知道了你走吧 – 我也要走了 – 好的再见)机制实现端到端的可靠连接,通过给报文加序号实现乱序重排,并通过滑动窗口协议实现出错重传
  • UDP协议属于无连接协议,不可靠,但是实时性高,只负责发送数据,不负责顺序发送和出错重传。
网络层
  • 网络层为传输层提供无连接的,尽最大努力交付的数据报服务,主要由IP协议,ICMP,IGMP协议和一系列路由方法协议组成。数据的可靠性需要传输层自己保证。
  • 网络层协议负责将传输层的报文段封装成ip分组(数据包),并实现路由寻径,找到一条从源主机到目的主机的通路。
  • 具体的数据流传输控制由链路层进行。
链路层
  • 链路层协议实现具体的二进制数据流传输,对上层掩盖了物理传输的具体细节,是TCP/IP模型的最底层
  • 链路层协议包括ARP,RARP等协议,实现了ip地址和物理mac地址的对应
  • 链路层根据物理网络状况将ip分组划分封装成数据帧进行传输,负责数据差错的检查和校验

socket编程预备知识

socket概述
  • socket是操作系统内核中的一种数据结构,用来在同一主机或不同主机的进程通信中标识不同进程。
  • Linux系统中的socket是一种特殊的I/O接口,同样由文件描述符进行管理,属于特殊类型的文件。 ,
  • 每一个 socket 都用一个半相关描述{协议、本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议、本地地址、本地端口、远程地址、远程端口}来表示。
  • 创建一个socket时只需要指明其通信域和通信协议类型即可
  • 通信域规定了socket的地址格式和通信范围
socket类型
  1. 流式 socket(SOCK_STREAM):用于 TCP 通信
  2. 数据报 socket(SOCK_DGRAM) :用于 UDP 通信
  3. 原始 socket(SOCK_RAW) :用于新的网络协议实现的测试等,可以直接访问网络层协议
socket地址类型

socke创建后需要绑定通信地址才能使用,socket的地址格式有两种如下:两种地址可以相互转化
1、sockaddr通用地址

struct sockaddr 
{
   
   
unsigned short sa_family; /*地址族*/
char sa_data[14]; /*14 字节的协议地址,包含该 socket 的 IP 地址和端口号。*/
};

sockaddr缺陷:sa_data把目标地址和端口信息混在一起,不利于网络通信
2、sockaddr_in网络地址

struct sockaddr_in 
{
   
   
short int sin_family; /*地址族*/
unsigned short int sin_port; /*端口号*/
struct in_addr sin_addr; /*IP 地址*/
unsigned char sin_zero[
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值