TCP通信(复习)

news2024/11/21 2:28:27

目录

TCP通信实现过程

1、socket函数与通信域

socket函数

 参 数

bind函数 与 通信结构体

bind函数

参数

通信地址族与同届结构体

 通用地址族结构体

IPV4地址族结构体

listen函数与accept函数

listen函数

accept函数

参 数

作 用


要实现进程间的通信必备:IP地址、端口号、协议(TCP or UDP)

TCP通信实现过程

1、建立连接;(socket, bind, listen, accept)

2、数据传输;(read / write,recv / send )

3、连接释放;(close, shutdown)

1、socket函数与通信域

socket函数

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

 参 数

-domain :指定通信域(通信地址族);

通信地址族种类:AF_INET : 使用ipv4互联网协议    AF_INET6 : 使用ipv6互联网协议,    等;

这里使用Ipv4;

-type :指定套接字类型;

TCP唯一对应流式套接字,所以选择SOCK_STREAM;

-protocol :指定协议;

流式套接字唯一对应 TCP ,所以不需要指定协议设置为 0 即可;

bind函数 与 通信结构体

bind函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数

-sockfd :socket函数生成的套接字;

-addr :通信结构体;

-addrlen :通信结构体长度;

通信地址族与同届结构体

通信地址族用于获取IP地址和端口号

 通用地址族结构体

struct sockaddr {
            sa_family_t sa_family;
            char        sa_data[14];
            }

IPV4地址族结构体

struct sockaddr_in {
            sa_family sin_family;    /*地址族:AF_INET*/
            in_port_t sin_port;      /*网络字节序的端口号*/
            struct in_addr sin_addr; /*IP地址结构体*/ 
};

/*IP地址结构体*/
struct in_addr {
            uint32_t s_addr;   /*网络字节序的IP地址*/
};

listen函数与accept函数

listen函数

/*监听套接字*/
int listen(int sockfd, int backlog);

accept函数

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参 数

-sockfd : 函数socket生成的套接字;

-addr : 客户端的地址族信息;

(struct socketaddr  --->是对应客户端的结构体)

-addrlen : 地址族结构体的长度;

作 用

accept() 函数用于套接字编程,其作用是接受来自客户端的连接请求。具体而言,它用于通信的服务器端接受客户端通过套接字终点发出的连接请求。

当客户端向服务器发起连接时,它会向服务器发送一个 SYN 包。服务器随后会响应一个 SYN-ACK 包。当客户端从服务器接收到 SYN-ACK 包时,它会向服务器发送一个 ACK 包以完成三次握手并建立连接。一旦建立了连接,服务器就会调用 `accept()` 函数来接受客户端的连接请求

`accept()` 函数会阻塞执行,直到收到新的客户端连接。一旦收到连接,`accept()` 函数将返回一个新的套接字描述符,该描述符将用于与客户端进行通信。这个新的套接字描述符表示一个特定客户端已连接到服务器的单独套接字终点。服务器随后可以使用新的套接字描述符来与客户端通信,以实现建立的连接。

inet_aton() 函数

是一个 C 库函数,用于将一个字符串形式的 IPv4 地址转换为一个网络字节序的二进制地址,然后存储到指定的网络地址结构体中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>
#include <signal.h>
#include <sys/wait.h>


#define BACKLOG 5

void SigHandle(int sig)
{
	if(sig == SIGCHLD){
		printf("clinet exited\n");
		wait(NULL);
	}

}

void ClinetHandle(int newfd);

int main(int argc, char *argv[])
{
	int fd ,newfd;
	struct sockaddr_in addr, clinet_addr;
	socklen_t addrlen = sizeof(clinet_addr);

	struct sigaction act;
	act.sa_handler = SigHandle;
	act.sa_flags = SA_RESTART;
	sigemptyset(&act.sa_mask);
	sigaction(SIGCHLD, &act, NULL);


	pid_t pid;

	/*参数检查*/
	if(argc < 3)
	{
		fprintf(stderr, "%s<addr><port>\n", argv[0]);
		exit(0);
	}

	/*创建套接字*/
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0) {
		perror("socket");
		exit(0);
	}

	/*地址快速重用*/
	int flag = 1, len = sizeof(int);
	if( setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)
	{
		perror("setsockopt");
		exit(1);
	}

	/*设置通信地址族结构体*/
	addr.sin_family = AF_INET;                   //网络协议;
	addr.sin_port = htons( atoi(argv[2]) );         //端口号;
	if (inet_aton(argv[1], &addr.sin_addr) == 0) {
		fprintf(stderr, "Invalid address\n");
		exit(EXIT_FAILURE);
	}

	/*绑定通信地址组*/
	if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
	{
		perror("bind");
		exit(0);
	}

	/*设置套接字为监听模式*/
	if(listen(fd, BACKLOG) == -1)
	{
		perror("listen");
		exit(0);
	}

	/*接收客户端连接请求*/
	while(1)
	{
	newfd = accept(fd, (struct sockaddr *)&clinet_addr, &addrlen);
	if(newfd < 0)
	{
		perror("accept");
		exit(0);
	}
	printf("addr:%s port:%d\n", inet_ntoa(clinet_addr.sin_addr), 
			ntohs(clinet_addr.sin_port));

	/*多进程并发*/
	if((pid = fork()) < 0)
	{
		perror("fork");
		exit(0);
	}else if (pid == 0){
		close(fd);
		ClinetHandle(newfd);
		exit(0);
	}else

		close(newfd);
	}


	/*关闭套接字文件描述符*/
	close(fd);


	return 0;
}


void ClinetHandle(int newfd)
{
	int ret;
	char buf[BUFSIZ] = {};
	/*循环接收客户端信息*/
	while(1)
	{
		memset(buf, 0, BUFSIZ);
		ret = read(newfd, buf, BUFSIZ);
		if(ret < 0)
		{
			perror("read");
			exit(0);
		}else if(ret == 0){
			break;
		}else{
			printf("buf=%s\n", buf);
		}
	}
	close(newfd);

}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>

#define BACKLOG 5

int main(int argc, char *argv[])
{
	int fd;
	char buf[BUFSIZ] = {};      
	struct sockaddr_in addr;

	/*参数检查*/
	if(argc < 3)
	{
		fprintf(stderr, "%s<addr><port>\n", argv[0]);
		exit(0);
	}

	/*创建套接字*/
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0) {
		perror("socket");
		exit(0);
	}

	/*设置通信地址族结构体*/
	addr.sin_family = AF_INET;                   //网络协议;
	addr.sin_port = htons( atoi(argv[2]) );         //端口号;
	if (inet_aton(argv[1], &addr.sin_addr) == 0) {
		fprintf(stderr, "Invalid address\n");
		exit(EXIT_FAILURE);
	}

	/*向服务器发起连接请求*/
	if( connect(fd,(struct sockaddr *)&addr, sizeof(addr)) == -1 )
	{
		perror("connect");
		exit(0);
	}

	/*循环接收客户端信息*/
	while(1)
	{
		printf("input:");
		fgets(buf, BUFSIZ, stdin);
		write(fd, buf, strlen(buf));
	}


	/*关闭套接字文件描述符*/
	close(fd);


	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Map、Set和哈希表(数据结构系列14)

目录 前言&#xff1a; 1.搜索树 1.1概念 1.2插入 1.3查找 1.4删除 1.5二叉搜索树整体代码展示 2. Map和Set的讲解 2.1 Map的说明 2.1.1Map的方法 2.2 Set 的说明 2.2.1Set的方法 3.哈希表 3.1哈希表的概念 3.2哈希冲突 3.3冲突的避免 3.4哈希冲突的解决 3.4…

企业物资管理系统的设计与实现(ASP.NET,SQL)

论文阐述了企业物资管理系统的设计与实现&#xff0c;并对该系统的需求分析及系统需要实现的设计方法作了介绍。该系统的基本功能包括用户登录&#xff0c;修改密码&#xff0c;物资的基本信息管理&#xff0c;出入库和损坏的管理已经综合查询等功能。 4.1 用户登录模块的实现 …

【滤波】非线性滤波

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第9章节09-Nonlinear-Filtering&#xff08;非线性滤波&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()介绍 我们开发的卡尔曼滤波器使用线性方程组&#xff0…

【C++】类和对象——拷贝构造函数的概念、拷贝构造函数的特征

文章目录 1.拷贝构造函数1.1拷贝构造函数的概念1.2拷贝构造函数的特征 1.拷贝构造函数 在前面我们已经介绍了构造函数和析构函数的作用和使用方法&#xff0c;而拷贝构造函数则是在对象初始化时调用的一种特殊构造函数。拷贝构造函数可以帮助我们创建一个新的对象&#xff0c;该…

互联网中的web3.0和gpt有何联系?

文章目录 ⭐前言⭐web 3.0&#x1f496; web1.0-web3.0的概念 ⭐chatgpt&#x1f496; gpt的概念 ⭐总结⭐结尾 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享互联网中的web3.0和gpt的关系。 互联网的发展 第一台计算机的出现 世界上第一台通用计算机“ENIAC”于…

C语言(扫雷)

扫雷 开发过程开发思路菜单界面游戏界面的打印雷的随机产生扫雷以及判断胜利条件代码整合 开发过程 准备工作效果展示 准备工作&#xff1a; game.h 一个头文件–>声明函数 test.c 为主文件 game.c 为功能函数实现文件 效果展示 开发思路 菜单界面 游戏界面打印&…

二、机器人的结构设计

1 、螺丝连接的坚固性 坚固性是机器人能顺利完成指定任务的一个重要条件&#xff0c;无论我们程序设计的如何完美&#xff0c; 如果不能保证机器人具有坚固性和稳定性&#xff0c;就无法保证任务的顺利完成&#xff0c;机器人在运行时如 果发生散架和分裂都会影响其功能的实现…

阿里云的白名单规则如何实现IP限制和访问控制?

阿里云的白名单规则如何实现IP限制和访问控制&#xff1f;   [本文由阿里云代理商[聚搜云]撰写]   随着企业在云计算领域的深入应用&#xff0c;网络安全问题日益凸显。阿里云提供了一种名为“白名单”的规则&#xff0c;帮助用户实现IP限制和访问控制。本文将详细阐述阿里…

“ 最近 ” ,准备跳槽的可以看看

前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在已经12月了&#xff0c;具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也…

【ROS】ROS2中的概念和名词解释

1、工作空间 workspace ROS以固定的目录结构创建项目工程&#xff0c;项目根目录称为工作空间 1.1 典型工作空间结构 src&#xff1a; 代码空间&#xff1b; build&#xff1a; 编译空间&#xff0c;保存编译过程中产生的中间文件&#xff1b; install&#xff1a;安装空间…

一种在不改变源码的情况下测试看门狗复位的方法

什么是“看门狗”&#xff1f; 看门狗定时器&#xff08;WDT&#xff0c;Watch Dog Timer&#xff09;是单片机的一个组成部分&#xff0c;它实际上是一个计数器&#xff0c;一般给看门狗一个数字&#xff0c;程序开始运行后看门狗开始倒计数。如果程序运行正常&#xff0c;过…

git使用X篇_2_Git全套教程IDEA版(git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容)

本文是根据以下视频及网上总结进行更新后的介绍git使用的博文。包含了git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容。 笔记来源&#xff1a;【尚硅谷】5h打通Git全套教程IDEA版&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 文章目录 初识 Git0、内容…

vue-echarts图表的应用(总结)

vue项目中echarts图表的应用(总结) 一 . 安装echarts包 npm i echarts 二 . 放置两个图表的div&#xff0c;并给定高宽 <div class"chart"><!-- 图表 --><div ref"social" style" width: 100%; height:100% " /> </div&g…

Python入门(十五)函数(三)

函数&#xff08;三&#xff09; 1.返回值1.1 返回简单值1.2 让实参变成可选的1.3 返回字典1.4 结合使用函数和while循环 作者&#xff1a;Xiou 1.返回值 函数并非总是直接显示输出&#xff0c;它还可以处理一些数据&#xff0c;并返回一个或一组值。函数返回的值称为返回值。…

【2023】Redis主从复制模式集群

资源有限&#xff0c;本文使用Docker部署目录 &#x1f3b6;主从模式介绍&#x1f3b6; 搭建主从模式集群&#x1f3b6; 使用命令搭建主从集群&#x1f3b6; 通过配置文件搭建主从模式集群 &#x1f3b6;配置读写分离&#x1f3b6; 用心跳机制提高主从复制的可靠性&#x1f3b6…

[golang 微服务] 3. ProtoBuf认识与使用

一.protobuf简介 前言 在移动互联网时代&#xff0c; 手机流量、 电量是最为有限的资源&#xff0c;而移动端的即时通讯应用无疑必须得直面这两点。解决流量过大的基本方法就是 使用高度压缩的通信协议&#xff0c;而数据压缩后流量减小带来的自然结果也就是省电&#xff1a;因…

#Verilog HDL# Verilog设计中的竞争问题和解决办法

经过前面文章的学习&#xff0c;我们知道&#xff1a;不管是Verilog设计语言&#xff0c;还是Sytemverilog验证语言&#xff0c;标准都定义了语言调度机制&#xff0c;来规范各家编译器和仿真器的开发。今天&#xff0c;我们着重看一下Verilog 硬件设计语言中竞争问题&#xff…

算法拾遗三十一马拉车算法

算法拾遗三十一马拉车算法 回文是什么回文暴力求法 Manacher算法回文直径和回文半径最右回文边界最右回文右边界的中心C位置Manacher求解过程Manacher 题 回文是什么 一个字符串正过来念和反过来念一样&#xff0c;总的来说就是有一个对称轴可能在字符上也可能在范围上面 回文…

算法刷题总结 (十一) 二叉树

算法总结11 二叉树 一、二叉树的概念1.1、什么是二叉树&#xff1f;1.2、二叉树的常见类型1.2.1、无数值&#xff08;1&#xff09;、满二叉树&#xff08;2&#xff09;、完全二叉树 1.2.2、有数值&#xff08;3&#xff09;、二叉搜索树&#xff08;4&#xff09;、平衡二叉搜…

设置服务器ssh远程连接时超时关闭的时间

我们通过ssh远程连接服务器时&#xff0c;如果一段时间客户端没有使用&#xff0c;就会与服务器断开连接。这个断开的时间我们是可以自己的设置的。 以linux centos系统为例&#xff0c; 具体设置方法如下&#xff1a; 1、通过下面的命令编译sshd配置文件 vim /etc/ssh/sshd_…