网络基础知识二(UDP、TCP通信实现过程及函数解析)

一、UDP

1、发送信息过程图解

UDP发送信息过程图解

2、函数解析

(1)创建套接字 socket

  • 函数格式:int socket(int domain,int type,int protocol);
  • 头文件:#include <sys/socket.h>

———————————————分割线————————————————

  • domian:指定网络层用什么协议

    地址域信息(参数类型):
    AF_INET:ipv4网络
    AF_INET6:ipv6网络
    AF_UNIX:本地域套接字(用于本地进程通信)
    
  • type:创建套接字类型

     SOCK_DGRAM:用户数据报套接字(UDP协议)
     SOCK_STREAM:流式套接字(TCP协议)
    
  • protocol:表示使用套接字类型默认协议

     头文件:#include <netinet/in.h>
     IPPRPTO_UDP:17
     IPPRPTO_TCP:6
    
  • 函数返回值:返回套接字描述符(本质上就是一个文件描述符)

    成功:大于等于0
    失败:小于0
    
  • 举个例子:int sockfd = socket(AF_INRT, SOCK_DREAM, IPPROTO_UDP);
    创建了一个名为sockfd的套接字,采用ipv4网络和UDP协议的数据报套接字。

(2)绑定地址信息 bind

  • 函数格式:int bind(int sockfd,const struct sockaddr * addr,socklen_t addrlen);

———————————————分割线————————————————

  • sockfd:socket函数返回的套接字描述符,将创建出来的套接字、网卡以及端口进行绑定。

  • addr:地址信息结构

     struct sockaddr //通用地址信息结构
     {
     	sa_family_t sa_family; /*地址域信息,占两个字节。
     							 决定了当前使用什么网络层协议
     							(AF_INET、AF_INET6、AF_UNIX)*/
     							
     	char sa_data[14]; /*本质上任何网络程序都不会直接填充
     	                    这14个字节的字符数组*/
     }
    
  • addrlen:地址信息结构的长度

(3)发送接口 sendto

  • 函数格式:ssize_t sendto(int sockfd,const void * buf,size_t len,int flags,const struct sockaddr * dest_addr.socklen_t addrlen);

———————————————分割线————————————————

  • sockfd:套接字描述符

  • buf:要发送的数据

  • len:发送数据的长度

  • flags:0(零——阻塞发送)

  • dest_addr:目标主机的地址信息结构(IP地址+端口号)

  • addrlen:目标主机地址信息结构的长度

  • 返回值

     成功:返回具体发送的字节数量
     失败:返回-1
    

(4)接收接口 recvfrom

  • 函数格式:ssize_t recvfrom(int sockfd,void * buf,size_t len,int flags,struct sockaddr * src_addr.socklen_t * addrlen);

———————————————分割线————————————————

  • sockfd:套接字描述符

  • buf:将数据接收到buf中

  • len:buf最大接受能力

  • flags:0(零——阻塞接收)

  • src_addr:这个数据来源的主机的地址信息结构

  • addrlen:输入输出型参数

  • 返回值

     成功:接收的字节数量
     失败:返回-1
    

(5)关闭套接字 close

  • 函数格式:close(int sockfd);

二、TCP

1、三次握手与发送信息过程图解

TCP连接与发送信息过程图解

2、四次挥手过程图解

在这里插入图片描述

2、函数解析

TCP的创建套接字和绑定套接字与UDP相同,可见UDP部分内容。

(1)监听 listen

  • 函数格式:int listen(int sockfd,int backlog);

———————————————分割线————————————————

  • sockfd:套接字描述符
  • backlog:已完成连接队列的大小
    在这里插入图片描述

(2)接收新连接 accept

  • 函数格式:int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen);
  • 从已经完成连接队列中获取已经完成三次握手的连接(注:没有连接的时候,调用accept也会阻塞)

———————————————分割线————————————————

  • addr:客户端的地址信息结构(客户端IP地址与端口)

  • addrlen:客户端地址信息结构的长度

  • 返回值

     成功:返回的是新连接的套接字描述符(图解见下)
     失败:返回-1
    

多个客户端会与TCP服务器的监听套接字进行三次握手从而建立连接,建立连接后每个客户端都有与之一一对应的通信套接字进行通信。在这里插入图片描述

(3)发起连接 connect

  • 函数格式:int connect(int sockfd,const struct sockaddr * addr,socklen_t * addrlen);

  • addr:服务器的地址信息结构(客户端IP地址与端口)

  • 返回值

     成功:返回0
     失败:小于0
    

(4)发送数据 send

  • 函数格式:ssize_t send(int sockfd,const void * buf,size_t len,int flags);

———————————————分割线————————————————

  • sockfd:accept返回的套接字描述符

  • buf:待要发送的数据

  • len:发送数据的长度

  • flags

     0(零):阻塞发送
     MSG_OOB:发送带外数据
    
  • 返回值

     成功:返回具体发送的字节数量
     失败:返回-1
    

(5)接收数据 recv

  • 函数格式:ssize_t recv(int sockfd,void * buf,size_t len,int flags);
    (注:如果连接没有数据,那么调用recv会阻塞)

———————————————分割线————————————————

  • sockfd:accept返回的套接字描述符

  • buf:将接收的数据放到这里

  • len:buf的最大接受能力

  • flags:0(零——阻塞接收)

  • src_addr:这个数据来源的主机的地址信息结构

  • 返回值

     大于0:正常接收了多少字节数据
     等于0:对端将连接关闭
     小于0:接收失败
    

(5)关闭套接字 close

  • 函数格式:close(int sockfd);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过TCPUDP协议实现网络通信。其中,TCP协议提供面向连接的、可靠的数据传输服务,而UDP协议则提供无连接的、不可靠的数据传输服务。 下面是Java实现TCP网络通信的例子: ```java // 服务器端 ServerSocket serverSocket = new ServerSocket(8888); Socket socket = serverSocket.accept(); InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String message = null; while ((message = br.readLine()) != null) { System.out.println("接收到客户端消息:" + message); } br.close(); socket.close(); serverSocket.close(); // 客户端 Socket socket = new Socket("127.0.0.1", 8888); OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("Hello, server!"); pw.flush(); socket.shutdownOutput(); socket.close(); ``` 下面是Java实现UDP网络通信的例子: ```java // 服务器端 DatagramSocket serverSocket = new DatagramSocket(8888); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); serverSocket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("接收到客户端消息:" + message); serverSocket.close(); // 客户端 DatagramSocket clientSocket = new DatagramSocket(); String message = "Hello, server!"; byte[] buffer = message.getBytes(); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("127.0.0.1"), 8888); clientSocket.send(packet); clientSocket.close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值