C/C++教程

网络编程TCP—2

本文主要是介绍网络编程TCP—2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、相关函数

1、inet_ntop() //网络字节序IP转字符串

SYNOPSIS

   #include <arpa/inet.h>

   const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

==> af : 地址族 AF_INET
==> src : 需要转换的网络字节序的IP变量的地址
==> dst : 转换之后的IP存放的位置
==> size : 第三个参数的size

在这里插入图片描述

2、Send()

NAME
send — send a message on a socket

SYNOPSIS

   #include <sys/socket.h>
   
   ssize_t send(int socket, const void *buffer, size_t length, int flags);

==> socket : TCP套接字
==> buffer : 需要发送的数据
==> length : 发送的数据的大小
==> flags : 数据属性 0 (如果flags赋值0,那么send就相当于write)

3、Recv()

NAME
recv — receive a message from a connected socket

SYNOPSIS

   #include <sys/socket.h>
   
   ssize_t recv(int socket, void *buffer, size_t length, int flags);

==> socket : TCP套接字
==> buffer : 需要接收的数据存放的缓冲区
==> length : 接收的数据的大小
==> flags : 数据属性 0 (如果flags赋值0,那么recv就相当于read)

二、服务器连接多个客户端

实现一个服务器同时连接多个客户端,可以接收每一个客户端的信息。

==> 分析
服务器在初始化套接字之后,TCP套接字会升级为监听套接字,监听套接字可以循环的被客户端连接,每次客户端连接成功,accept函数会返回一个会话ID。

==> 实现方案
服务器初始化监听套接字之后,主线程循环的等待客户端连接,每次有一个客户端成功连接,那就创建一条线程去循环接收这个会话ID里面的内容

例子: 设计一个服务器端程序,服务器可以最多同时连接20个客户端,每次有客户端成功连接,那就打印”客户端ip[192.168.15.xx],port[xxx]连接成功!”, 然后这个客户发送信息都可以接收到。

晚上作业1:
实现一个服务器转发信息功能。
服务器循环接收客户端的连接,客户端连接成功之后可以给服务器发送数据,服务器接收到数据之后就给每一个连接的客户端进行转发。

三、TCP传输控制协议实现文件传输

TCP传输协议是一个可靠的传输协议,在通信之前需要先建立连接。

1、TCP通信中的三次握手与四次分手

在这里插入图片描述

2、实现文件传输的步骤

1)发送方

==> 给发送方文件路径名 (判断文件是否存在,不存在就结束,如果存在,那就获取文件信息: 文件名字,大小,属性…)

==> 连接到接收方 --> connect

==> 第一个数据包包含文件的相关信息 (文件名,文件大小…)

==> 循环发送文件内容 --> 直到文件内容被发送完毕,结束。

==> 断开连接,结束程序

2)接收方

==> 初始化网络连接 --> accept();

==> 接收第一个数据包,对数据包进行解析,得到文件的相关信息

==> 在本地创建一个同名文件

==> 循环接收数据,写入新文件 (直到接收到的数据大小等于文件大小时停止接收)

==> 断开连接,结束程序。

四、UDP传输协议实现通信

1、UDP协议特点

·面向非连接 (不需要建立连接 --> 效率高)
·不可靠传输协议 (不保证数据一定正确到达)

==> 一般在网络环境不太稳定的情况下需要使用UDP协议

2、UDP通信实现流程 – 寄信

在这里插入图片描述

==> 例子: 设计UDP通信的发送端和接收端功能代码。

相关函数:

1)Sendto() //–> 发送一个UDP数据包

SYNOPSIS

   #include <sys/types.h>
   #include <sys/socket.h>

   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

2)recvform() //–> 接收数据

SYNOPSIS

   #include <sys/socket.h>

   ssize_t recvfrom(int socket, void *restrict buffer, size_t length,
       int flags, struct sockaddr *restrict address,
       socklen_t *restrict address_len);

==> sockfd : 套接字
==> buf : 存放接收的的数据内容的缓冲区
==> len : 想要接收的数据的大小
==> flags : 数据标志 0
==> dest_addr : 发送的IP地址结构体
==> addrlen : 地址结构体大小
返回值: 成功返回实际接收的字节数,失败返回-1

这篇关于网络编程TCP—2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!