目录简述:
前言:
一、网络通信概述
二、网络编程主要函数
(1)socket函数
(2)bind函数
(3)bind函数
(4)accept函数
(5)connect函数
(6)send函数
(7)recv函数
(8)recvform函数
(9)sendto函数
前言:
初始环节:带着以下的问题,针对性的阅读实践,更容易深入
(1)什么是网络通信?
- ①网络中的数据传输,基本元素有哪些?
- ②一般网络协议的五层结构,每一层的作用是什么?
- ③传输层协议的TCP和UDP,它们的特点是什么?应用场景?
- ④TCP/UDP网络通信流程是怎么样的?
(2)网络编程主要函数介绍
接下来的文章内容,将详细的解答上面的问题。如果有一些些帮助,不妨三连关注( ^_^ )。
一、网络通信概述
什么是网络通信?
网络通信是指两台或多台计算机之间的连线通讯,以完成网络服务的过程。它是构成互联网的重要一环,以及为用户提供从一台计算机到另一台计算机的远程连接的计算机网络通讯方式。
网络通信中最重要的就是网络通信协议。常用的通讯协议有TCP/IP协议、IPX/SPX协议、NetBEUI协议。
①网络中的数据传输,基本元素有哪些?
所有的数据传输,都有三个元素:源、目的、长度。在网络传输中是使用“IP和端口”来表示源或目的。如下图所示:
在传输中,是有两个对象,服务器和客户端。客户端主动发起请求,服务器被动地响应请求。
②网络协议是非常重要的,一般网络协议的五层结构,每一层的作用是什么呢?
- 应用层:它是体系结构中的最高层,直接为用户的应用进程(例如电子邮件、 文件传输和终端仿真)提供服务
- 运输层:负责向两个主机中进程之间的通信提供服务。传输层主要使用的两种协议,TCP和UDP。
- 网络层:负责将被称为数据包(datagram)的网络层分组从一台主机移动到另一台主机。
- 链路层:因特网的网络层通过源和目的地之间的一系列路由器路由数据报。
- 物理层:在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。
这里,我们需要“运输层”编写应用程序,我们的应用程序位于“应用层”。
③TCP和UDP是什么?它们的特点是什么?应用场景?
(1)传输控制协议 TCP(Transmission Control Protocol):面向连接的,数据传输的单位是报文段,能够提供可靠的交付。
TCP 向它的应用程序提供了面向连接的服务。这种服务有 2 个特点:可靠传输、流量控制(即发送方/接收方速率匹配)。它包括了应用层报文划分为短报文,并提供拥塞控制机制。
- 关于何时发送什么数据控制的更为精细
- 采用 UDP 时只要应用进程将数据传递给 UDP,UDP 就会立即将其传递给网络层。而 TCP 有重传机制,而不管可靠交付需要多长时间。但是实时应用通常不希望过分的延迟报文段的传送,且能容忍一部分数据丢失。
- 无需建立连接,不会引入建立连接时的延迟。
- 无连接状态,能支持更多的活跃客户。
- 分组首部开销较小。
④TCP/UDP网络通信流程是怎么样的?
TCP网络通信流程如下图所示: (服务器为例)
- 创建一个套接字(socket)
- 将地址绑定到套接字上(bind)
- 宣告服务器可以接受连接请求(listen)
- 获得连接请求,并建立连接(accept)
- 发送和接受数据(send、receive)
- 结束连接(close)
UDP网络通信流程如下图所示: (服务器为例)
- 创建一个套接字(socket)
- 将地址绑定到套接字上(bind)
- 发送和接受数据(sendto、receiveform)
- 结束连接(close)
二、网络编程主要函数
(1)socket函数
int socket(int domain, int type,int protocol);
1.domain:网络程序所在的主机采用的通讯协族(AF_UNIX 和 AF_INET 等)。
2.type: 网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM 等)。
- SOCK_STREAM对应的TCP。
- SOCK_DGRAM对应的UDP
protocol: 指定了type,这个地方一般只要用0来代就可以了。
(2)bind函数
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
1.sockfd: 是由 socket 函数调用返回的文件描述符。
2.my_addr: 是一个指向 sockaddr 的指针。
3.addrlen: 是 sockaddr 结构的长度。
(3)bind函数
int listen(int sockfd,int backlog);
listen函数将 bind 的文件描述符变为监听套接字,返回的情况和 bind 一样。
1.sockfd: 是 bind 后的文件描述符。
2.backlog:设置请求排队的最大长度。当有多个客户端程序和服务端相连时,使用这个表示可以介绍的排队长度。
(4)accept函数
int accept(int sockfd, struct sockaddr *addr,int *addrlen);
accept 调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。accept 成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了,失败时返回-1 。
1.sockfd: 是 listen 后的文件描述符。
2.addr,addrlen: 是用来给客户端的程序填写的,服务器端只要传递指针就可以了, bind,listen和 accept 是服务器端用的函数。
(5)connect函数
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);
可以用 connect 建立一个连接,在 connect 中所指定的地址是想与之通信的服务器的地址。
1.sockfd:socket 函数返回的文件描述符。
2.serv_addr:储存了服务器端的连接信息,其中 sin_add 是服务端的地址。
3.addrlen:serv_addr 的长度
connet函数是客户端用来同服务端连接的.成功时返回 0,sockfd 是同服务端通讯的文件描述符,失败时返回-1。
(6)send函数
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
客户或者服务器应用程序都用 send 函数来向 TCP 连接的另一端发送数据。
1.sockfd 指定发送端套接字描述符;
2.buf 指明一个存放应用程序要发送数据的缓冲区;
3.len 指明实际要发送的数据的字节数;
4.flags 一般置 0。
(7)recv函数
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
客户或者服务器应用程序都用 recv 函数从 TCP 连接的另一端接收数据。
1.sockfd 指定接收端套接字描述符;
2.buf 指明一个缓冲区,该缓冲区用来存放 recv 函数接收到的数据;
3.len 指明 buf 的长度;
4.flags 一般置 0。
(8)recvform函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
1.recvfrom: 通常用于无连接套接字,因为此函数可以获得发送者的地址。
2.src_addr: 是一个 struct sockaddr类型的变量,该变量保存源机的 IP 地址及端口号。
3.addrlen: 常置为sizeof(struct sockaddr)。
(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 允许在无连接的套接字上指定一个目标地址。
1.dest_addr: 表示目地机的 IP 地址和端口号信息
2.addrlen: 常常被赋值为sizeof(struct sockaddr)。
3.sendto: 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。