Linux编程4.8 网络编程-建立连接

1、服务器端


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

  int listen(int sockfd, int backlog);
  返回:成功返回0,出错返回-1。
  参数:
		sockfd:套接字的文件描述符
		backlog:定义了sockfd的挂起连接队列可能增长的最大长度。

  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  参数:
		sockfd:套接字的文件描述符。
		addr:指向sockaddr结构的指针。这个结构是用通信层已知的对等套接字的地址填充的。
		addrlen:结果参数,返回时,它将包含对等地址的实际大小。

示例:
在这里插入图片描述

2、客户端

#include <sys/socket.h>
  int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
  
  返回:成功返回0,出错返回-1。
  功能:系统调用将文件描述符sockfd引用的套接字连接到addr指定的地址。
  参数:
	addrlen:指定addr的大小。
	addr:要连接的服务器地址,其中地址的格式由套接字sockfd的地址空间决定

示例:
在这里插入图片描述

3、服务器完整示例

nt main(void)
{
	//1. 创建套接字
	int serverfd = socket(AF_INET, SOCK_STREAM, 0);
	if(serverfd < 0){
		perror("创建套接字失败");
		exit(1);
	}

	//2. 绑定套接字
	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = INADDR_ANY;

	if(bind(serverfd, (struct sockadr*)&addr, sizeof(addr)) < 0){
		perror("绑定套接字失败");
		exit(1);
	}

	//3. 监听
	if(listen(serverfd, 5) < 0){
		perror("监听套接字失败");
		exit(1);
	}

	struct sockaddr_int client_addr;
	socklen_t client_len = sizeof(client_addr);

	fd_set fds, tds;
	FD_ZERO(&fds);
	FD_SET(serverfd, &fds);

	//4. 接受
	while(1){
		tds = fds;
		//使用select同时监听serverfd与其他若干clientfd,
		int ret = select(FD_SETSIZE, &tds, NULL, NULL, NULL);
		if(ret < 0){
			perror("");
			exit(1);
		}else if(ret > 0){
			//准备好了
			int i = 0, j = 0;
			for(i = 3; i < FD_SETSIZE && j < ret; i++){
				if(FD_ISSET(i, &tds)){
					//有东西可读
					j++;

					if(i == serverfd){
						//需要accept
						int clientfd = 0;
						if((clientfd = accept(serverfd, (struct sockaddr*)&client_addr, &client_len)) < 0){
							perror("");
							exit(1);
						}else{
							//接受成功
							printf("新的连接:ip:%s port:%d\n", inet_ntop(client_addr.sin_addr.s_addr), ntohs(client_addr.sin_port));
							FD_SET(clientfd, &fds);
						}
					}else{
						char str[1024] = "";
						//客户端读取
						if(read(i, str, sizeof(str)) == 0){
							//套接字关闭
							FD_CLR(i, &fds);
							close(i);
						}else{
							//switch(){}
						}
					}
					
				}
			}
		}else{}
	}

	return 0;
}

4、客户端完整示例

int main(void)
{
	//1. 创建套接字
	client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(client_sockfd < 0){
		perror("");
		exit(1);
	}

	//2. 连接
	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
	addr.sin_port = htons(12000);

	if(connect(client_sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
		perror("");
		exit(1);
	}

	pthread_t pid;
	pthread_attr_t attr;	
	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

	pthread_create(&pid, &attr, pthread_recv, &client_sockfd);

	main_menu();//	循环

	close(client_sockfd);

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙4.0ArkUI快速入门(一)应用模型

ArkUI篇 应用模型Stage模型FA模型模型对比 应用模型 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。 HarmonyOS先后提供了两种应用模型&#xff1a; FA&#xff08;Feature Ability&#xff09;模型&…

Vue多文件学习项目综合案例——小兔鲜,黑马vue教程

文章目录 一、项目截图二、主要知识点三、Main.js四、App.vue五、componentsXtxBanner.vueXtxFooter.vueXtxHeaderNav.vueXtxHotBrand.vueXtxNewGoods.vueXtxShortCut.vueXtxTopic.vue 六、stylesbase.csscommon.css 一、项目截图 二、主要知识点 把静态页面拆分成一个个vue组…

Axure软件安装汉化教程

Axure软件安装汉化教程 一、准备教程 下载Axure的软件&#xff0c;并解压打开 二、安装过程 双击Axure软件的运行程序&#xff0c;修改安装程序的路径&#xff0c;默认下一步即可。 三、软件汉化 打开Axure的软件安装路径&#xff0c;将汉化包复制粘贴进入到Axure RP 9安装…

Web入门

一Spring简单介绍&#xff1a; Spring Boot 是基于Spring的但是&#xff0c;Spring更为简单高效。 1.2Spring Boot快速入门&#xff1a; 二HTTP协议&#xff1a; 2.1HTTP协议概述 2.2请求协议 <!DOCTYPE html> <html lang"en"> <head><meta ch…

Linux部署DockerUI结合内网穿透实现远程管理本地Docker容器

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

文献速递:深度学习乳腺癌诊断---使用深度学习改善乳腺癌诊断的MRI技术

Title 题目 Improving breast cancer diagnostics with deep learning for MRI 使用深度学习改善乳腺癌诊断的MRI技术 01 文献速递介绍 乳腺磁共振成像&#xff08;MRI&#xff09;是一种高度敏感的检测乳腺癌的方式&#xff0c;报道的敏感性超过80%。传统上&#xff0c;其…

第六届国际大数据工程大会(BDE 2024)即将召开!

2024年第六届国际大数据工程大会(BDE 2024)将于2024年7月24-26日在中国西宁举行。本次会议由青海民族大学和中国矿业大学联合主办。BDE 2024旨在为大数据工程国际等领域的全球学术界、产业界和研究开发组织的研究人员提供一个交流平台&#xff0c;欢迎大数据领域的专家学者踊跃…

设计模式在业务中的实践

一、前言 随着美团外卖业务的不断迭代与发展&#xff0c;外卖用户数量也在高速地增长。在这个过程中&#xff0c;外卖营销发挥了“中流砥柱”的作用&#xff0c;因为用户的快速增长离不开高效的营销策略。而由于市场环境和业务环境的多变&#xff0c;营销策略往往是复杂多变的…

小白向-使用git实现不同服务器改动的同步

背景 深度学习项目&#xff0c;已有可运行的backbone&#xff0c;已将此项目在github建库。 需要使用不同分支进行不同改动的测试&#xff1b;有两台服务器可供程序运行&#xff1b; 项目需求 以github云端仓库为媒介&#xff0c;实现不同服务器改动无痛关联。维护项目代码…

Docker的简介及安装

Docker 是什么 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。诞生于2013年&#xff0c;最 初的发起者是dotCloud公司&#xff0c;后来改名为Docker Inc&#xff0c;专注于Docker 相关技术和产品的开发。Docker 项目目前已经加入了Linux基金会…

【目标检测】YOLOv2 网络结构(darknet-19 作为 backbone)

上一篇文章主要是写了一些 YOLOv1 的原版网络结构&#xff0c;这篇文章一样&#xff0c;目标是还原论文中原版的 YOLOv2 的网络结构&#xff0c;而不是后续各种魔改的版本。 YOLOv2 和 YOLOv1 不一样&#xff0c;开始使用 Darknet-19 来作为 backbone 了。论文中给出了 Darkne…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FolderStack)

FolderStack继承于Stack(层叠布局)控件&#xff0c;新增了折叠屏悬停能力&#xff0c;通过识别upperItems自动避让折叠屏折痕区后移到上半屏 说明&#xff1a; 该组件从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件…

数据在内存的存储

整数在内存中的存储 我们来回顾一下&#xff0c;整数在计算机是以补码的形式进行存储的&#xff0c;整数分为正整数和负整数&#xff0c;正整数的原码、反码和补码是一样的&#xff0c;负整数的原码、反码和补码略有不同&#xff08;反码是原码除符号位&#xff0c;其他位按位取…

【九】【算法分析与设计】双指针(3)

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元…

SpringBoot(数据库操作 + druid监控功能)

文章目录 1.JDBC HikariDataSource&#xff08;SpringBoot2默认数据源&#xff09;1.数据库表设计2.引入依赖 pom.xml3.配置数据源参数 application.yml4.编写一个bean&#xff0c;映射表5.编写测试类来完成测试1.引入依赖 pom.xml2.使用JdbcTemplate进行测试3.成功&#xff0…

STM32信息安全 1.2 课程架构介绍:芯片生命周期管理与安全调试

STM32信息安全 1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&…

01背包问题详解

01背包问题是动态规划问题的子背包问题&#xff0c;算是蓝桥杯以及CSP较为常考的一种题型。 这种问题是有一个板子的&#xff0c;非常简单 #include <bits/stdc.h> using namespace std;int k[200],v[200],dp[130][130]; int main() {int t,m;cin>>t>>m;fo…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— Toggle切换按钮组件

概述 Toggle为切换按钮组件&#xff0c;一般用于两种状态之间的切换&#xff0c;例如下图中的蓝牙开关。 参数 Toggle组件的参数定义如下 Toggle(options: { type: ToggleType, isOn?: boolean })● type type属性用于设置Toggle组件的类型&#xff0c;可通过ToggleType枚举…

【MIT 6.S081】2020, 实验记录(9),Lab: file system

目录 Task 1&#xff1a;Large filesTask 2&#xff1a;Symbolic links2.1 增加一个系统调用 symlink2.2 新增文件类型2.3 新增 NOFOLLOW 标志位2.4 实现 sys_symlink 系统调用2.5 修改 sys_open 函数2.6 测试 Task 1&#xff1a;Large files 现在的 xv6 系统中&#xff0c;一…

基础:TCP三次握手做了什么,为什么要握手?

1. TCP 三次握手在做些什么 1. 第一次握手 &#xff1a; 1&#xff09;握手作用&#xff1a;客户端发出建立连接请求。 2&#xff09;数据处理&#xff1a;客户端发送连接请求报文段&#xff0c;将SYN位置为1&#xff0c;Sequence Number为x;然后&#xff0c;客户端进入SYN_S…