Linux----网络通信

张开发
2026/4/19 4:26:37 15 分钟阅读

分享文章

Linux----网络通信
目录1.为什么要用网络通信2.IP和端口3.网络传输中的2个对象server和client4.两种传输方式TCP/UDP(1).TCP和UDP原理上的区别(2). UDP 协议存在的意义(3). TCP/UDP 网络通信大概交互图5.网络编程主要函数介绍1.socket 函数未涉及三要素2.bind 函数---绑定IP和端口3.listen 函数---监听4.accept 函数5.connect 函数6. send 函数7.recv 函数8.recvfrom 函数9.sendto 函数1.为什么要用网络通信在客户端-服务器架构模型中客户端向服务器发送请求服务器处理请求并返回结果。这种架构适用于Web服务、数据库查询等多种应用场景而printf只能用于本地输出无法满足跨网络的数据交换需求。2.IP和端口所有的数据传输都有三个要素源、目的、长度。如何表示源或者目的呢笔记本上两个浏览器访问同一个网站浏览器发出的数据里源IP、服务器IP、目的端口都相同。但是他们的源端口不一样服务器根据源端口来区分一个IP下的两个连接。笔记本上两个软件SSH Client和浏览器访问同一个网站SSH Client想使用SSH服务浏览器想使用http服务这两个程序要访问的服务器时同一个IP相同。但是端口不一样http服务是80端口SSH服务是22端口。所以在网络传输中需要使用“ IP 和端口”来表示源或目的。3.网络传输中的2个对象server和client在日常访问的浏览器中涉及2个对象网站服务器浏览器。网站服务器平时处于等待浏览器主动发起数据请求。网站服务器、浏览器可以抽象成 2 个软件的概念 server 程序、 client 程序。图 3.1 网络客户端和服务器4.两种传输方式TCP/UDP在学习计算机网络的数据中网络协议被分为5层。如图4.1所示图4.1网络协议层此处只简单介绍运输层对于其他4层不做介绍。运输层负责向两个主机中进程之间的通信提供服务。运输层主要使用以下两种协议传输控制协议TCPTransmission Control Protocol面向连接的数据传输的单位是报文段提供可靠的交付。如命令传输。用户数据包协议UDPUser Datagram Protocol无连接的数据传输的单位是用户数据报不保证提供可靠交付只能提供“尽最大努力交付”。我们需要使用“运输层”编写应用程序我们的应用程序位于“应用层”。使用“运输层”时可以选择 TCP 协议也可以选择 UDP 协议。(1).TCP和UDP原理上的区别TCP 向它的应用程序提供了面向连接的服务。这种服务有 2 个特点可靠传输、流量控制即发送方/接收方速率匹配。它包括了应用层报文划分为短报文并提供拥塞控制机制。UDP 协议向它的应用程序提供无连接服务。它没有可靠性没有流量控制也没有拥塞控制。(2). UDP 协议存在的意义既然 TCP 提供了可靠数据传输服务而 UDP 不能提供但是有许多应用更适合用 UDP例如视频通话时使用 UDP偶尔的丢包、偶尔的花屏时可以忍受的如果使用 TCP每个数据包都要确保可靠传输当它出错时就重传这会导致后续的数据包被阻滞视频效果反而不好。UDP 特点发送数据控制的更为精细。采用 UDP 时只要应用进程将数据传递给 UDP UDP 就会立即将其传递给网络层。而 TCP 有重传机制不管可靠交付需要多长时间。但是实时应用通常不希望过分的延迟报文段的传送且能容忍一部分数据丢失。无需建立连接不会引入建立连接时的延迟。无连接状态能支持更多的活跃客户。分组首部开销较小。(3). TCP/UDP 网络通信大概交互图4.1 面向连接的 TCP 流模式图4.2 UDP 用户数据包模式5.网络编程主要函数介绍bind,listen 和 accept 是服务器端用的函数。1.socket 函数未涉及三要素int socket(int domain, int type,int protocol);作用用于创建一个套接字socket该套接字可以用于后续的网络通信。参数domain(地址族)常见的值包括AF_INETIPv4 地址族AF_INET6IPv6 地址族AF_UNIX本地通信Unix 域套接字参数type(套接字类型):常见的值包括SOCK_STREAM面向连接的流式套接字通常用于 TCP 协议SOCK_DGRAM无连接的数据报套接字通常用于 UDP 协议SOCK_RAW原始套接字用于底层网络协议开发参数protocol(协议)由于指定了 type所以这个地方一般只要用 0 来代替就可以了。返回值此函数执行成功时返回文件描述符失败时返回-1,看 errno 可知道出错的详细情况。2.bind 函数---绑定IP和端口int bind(int sockfd, struct sockaddr *my_addr, int addrlen);作用用于将地址绑定到一个套接字。参数sockfd(套接字描述符)这是由socket函数创建的套接字描述符。参数my_addr(地址结构指针)指向一个包含地址信息的结构体的指针。对于 IPv4通常使用struct sockaddr_in结构体对于 IPv6通常使用struct sockaddr_in6结构体。sockaddr_in 的定义struct sockaddr_in{ unsigned short sin_family; unsigned short sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; } 如果使用 Internet 所以 sin_family 一般为 AF_INET。 ⚫ sin_addr 设置为 INADDR_ANY 表示可以和任何的主机通信。 ⚫ sin_port 是要监听的端口号。 ⚫ bind 将本地的端口同 socket 返回的文件描述符捆绑在一起.成功是返回 0, 失败的情况和 socket 一样。参数addrlen(地址结构长度)指定地址结构体的长度。返回值成功时返回 0。失败时返回 -1并设置errno变量以指示错误原因。3.listen 函数---监听int listen(int sockfd,int backlog);作用 宣告服务器可以接受连接请求将 bind 的文件描述符变为监听套接字。参数sockfd bind 后的文件描述符。参数backlog 设置请求排队的最大长度。当有多个客户端程序和服务端相连时使用这个表示可以介绍的排队长度。返回值返回的情况和 bind 一样。4.accept 函数int accept(int sockfd, struct sockaddr *addr,int *addrlen);作用 服务器使用此函数获得连接请求并且建立连接。参数sockfdlisten 后的文件描述符。参数addr和addrlen用来给客户端的程序填写的,服务器端只要传递指针就可以了tips:accept 调用时服务器端的程序会一直阻塞到有一个客户程序发出了连接。accept 成功时返回最后的服务器端的文件描述符这个时候服务器端可以向该描述符写信息了失败时返回-1 。5.connect 函数int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);作用建立一个连接在 connect 中所指定的地址是想与之通信的服务器的地址。参数sockfdsocket 函数返回的文件描述符。参数serv_addr储存了服务器端的连接信息其中 sin_add 是服务端的地址。参数addrlenserv_addr 的长度返回值成功时返回 0失败时返回-1。6. send 函数ssize_t send(int sockfd, const void *buf, size_t len, int flags);作用客户端和服务器都用send函数向另一端发送数据。参数sockfd 指定发送端套接字描述符参数buf 指明一个存放应用程序要发送数据的缓冲区参数len 指明实际要发送的数据的字节数参数flags 一般置 0。返回值回实际发送的字节数。失败返回 -1并设置errno变量以指示错误原因。7.recv 函数ssize_t recv(int sockfd, void *buf, size_t len, int flags);作用客户或者服务器应用程序都用 recv 函数从 TCP 连接的另一端接收数据。参数sockfd 指定接收端套接字描述符参数buf 指明一个缓冲区该缓冲区用来存放 recv 函数接收到的数据参数len 指明 buf 的长度参数flags 一般置 0。返回值回实际发送的字节数。失败返回 -1并设置errno变量以指示错误原因。8.recvfrom 函数ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);参数 recvfrom 通常用于无连接套接字因为此函数可以获得发送者的地址。参数 src_addr 是一个 struct sockaddr 类型的变量该变量保存源机的 IP 地址及端口号。参数 addrlen 常置为 sizeof struct sockaddr。返回值回实际发送的字节数。失败返回 -1并设置errno变量以指示错误原因。9.sendto 函数ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);sendto 和 send 相似区别在于 sendto 允许在无连接的套接字上指定一个目标地址。参数dest_addr 表示目地机的 IP 地址和端口号信息参数addrlen 常常被赋值为 sizeof struct sockaddr。返回值回实际发送的字节数。失败返回 -1并设置errno变量以指示错误原因。

更多文章