ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

网络编程TCP—2

2021-07-29 23:33:31  阅读:150  来源: 互联网

标签:int 编程 网络 TCP flags 接字 接收 连接 客户端


一、相关函数

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

标签:int,编程,网络,TCP,flags,接字,接收,连接,客户端
来源: https://blog.csdn.net/lianggoch/article/details/119213704

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有