当前位置: 首页 > news >正文

Linux网络编程:TCP编程实现

目录

1、前言

2、函数介绍

2.1 socket函数 与 通信域 

2.2 bind函数 与 通信结构体 

2.2.1 domain通信地址族 与 通信结构体 

2.2.2 IPv4地址族结构体 

2.2.3 通用地址族结构体 

2.2.4 示例:为套接字fd绑定通信结构体addr 

2.3 listen函数 与 accept函数 

3、代码实现

3.1 服务器端代码 

3.2 客户端代码 

3.3 构建Makefile 

4、实验结果 


1、前言

使用Linux操作系统实现TCP的客户端及服务器

TCP通信的实现过程示意图如下:

2、函数介绍

2.1 socket函数 与 通信域 

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
  • domain: 指定通信域(通信地址族),AF_INET: 使用IPv4 互联网协议;AF_INET6: 使用IPv6 互联网协议;
  • type: 指定套接字类型,TCP唯一对应流式套接字,所以选择SOCK_STREAM(数据报套接字:SOCK_DGRAM);
  • protocol: 指定协议,流式套接字唯一对应TCP,所以无需要指定协议,设为0即可。

2.2 bind函数 与 通信结构体 

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd:socket函数生成的套接字
  • addr:通信结构体
  • addrlen:通信结构体的长度

2.2.1 domain通信地址族 与 通信结构体 

2.2.2 IPv4地址族结构体 

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

2.2.3 通用地址族结构体 

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

2.2.4 示例:为套接字fd绑定通信结构体addr 

addr.sin_family = AF_INET;
addr.sin_port = htons(5001);
addr.sin_addr.s_addr = 0;//本机地址
bind(fd, (struct sockaddr *)&addr, sizeof(addr) );

2.3 listen函数 与 accept函数 

/*监听套接字*/
int listen(int sockfd, int backlog);
/*处理客户端发起的连接,生成新的套接字*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockfd: 函数socket生成的套接字
  • addr:客户端的地址族信息
  • addrlen:地址族结构体的长度 

3、代码实现

3.1 服务器端代码 

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>#define BACKLOG 5int main(int argc,char *argv[])
{int fd,newfd,ret;char buf[BUFSIZ] = {};//BUFSIZ 8142struct sockaddr_in addr;if(argc < 3){printf("%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(0);}/*绑定通信结构体*/if(bind(fd,(struct sockaddr *)&addr,sizeof(addr)) == -1){perror("bind");exit(0);}/*设置套接字为侦听模式*/if(listen(fd,BACKLOG) == -1){perror("listen");exit(0);}/*接受客户端的连接请求,生成新的用于和客户端通信的套接字*/newfd = accept(fd,NULL,NULL);if(newfd < 0){perror("accept");exit(0);}printf("BUFSIZ = %d\n",BUFSIZ);while(1){memset(buf,0,BUFSIZ);ret = read(newfd,buf,BUFSIZ);if(ret < 0 ){perror("read");exit(0);}else if(ret == 0)break;printf("buf = %s\n",buf);}close(newfd);close(fd);return 0;
}

3.2 客户端代码 

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>#define BACKLOG 5
int main(int argc,char *argv[])
{int fd;struct sockaddr_in addr;char buf[BUFSIZ] = {};if(argc < 3){printf("%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(0);}/*向服务端发起连接请求*/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;
}

3.3 构建Makefile 

Makefile文件如下: 


CC=gcc
CFLAGS=-Wall
all:client serverclean:rm client server

使用make去构建服务器和客户端程序。

在服务器端传入ip地址和端口号,本机地址写0,端口号写5001。

./server 0 5001

在客户端传入ip地址和端口号,连接地址写127.0.0.1(本地回环地址),端口号写5001。 

./client 127.0.0.1 5001

4、实验结果 

通过截图可以看到,测试成功,客户端发送消息,服务器端可以接收并打印。 

相关文章:

Linux网络编程:TCP编程实现

目录 1、前言 2、函数介绍 2.1 socket函数 与 通信域 2.2 bind函数 与 通信结构体 2.2.1 domain通信地址族 与 通信结构体 2.2.2 IPv4地址族结构体 2.2.3 通用地址族结构体 2.2.4 示例&#xff1a;为套接字fd绑定通信结构体addr 2.3 listen函数 与 accept函数 …...

小剧场短剧影视小程序源码_后端PHP

项目运行截图 源码贡献 https://githubs.xyz/boot?app42 部署说明 linux/win任选 PHP版本&#xff1a;7.3/7.2&#xff08;测试时我用的7.2要安装sg扩展 &#xff09; 批量替换域名http://video.owoii.com更换为你的 批量替换域名http://120.79.77.163:1更换为你的 这两个…...

C语言总结三:数组(压缩版)

一&#xff0c;数组概念 定义&#xff1a;相同类型元素的集合 二&#xff0c;一维数组 1&#xff0c;语法&#xff1a;type arr_name[常量值]; 2&#xff0c;初始化&#xff1a;int arr[5]{1,2,3,4,5}; 3&#xff0c;类型&#xff1a;int [5] 4&#xff0c;使用&#xff1…...

我独自升级崛起怎么玩 我独自升级崛起游玩教程分享

《我独自升级&#xff1a;ARISE》是一款预计在 Android、iOS 和 PC 平台推出的动作 RPG&#xff0c;故事内容基于网络漫画版本改编&#xff0c;讲述世界各地出现「次元传送门」&#xff0c;而少部分人类觉醒了可以对抗传送门中怪物的「猎人」能力&#xff0c;玩家可以在故事模式…...

前端上传大文件

在前端实现大文件上传&#xff0c;通常涉及以下几个关键步骤和技术要点&#xff0c;以确保上传过程既高效又稳定&#xff1a; 1. 文件切片 目的&#xff1a;将大文件分割成多个小块&#xff0c;以减少单次请求的负担&#xff0c;提高上传速度&#xff0c;并且增强上传的稳定性…...

Kompas AI图片转换器:高效解决格式不兼容问题

最新Kompas AI&#xff1a;一键转换图片格式&#xff0c;提升工作效率 在数字化的世界里&#xff0c;图片已成为我们交流和分享信息不可或缺的媒介。然而&#xff0c;不同的场景往往需要不同格式的图片&#xff0c;这时&#xff0c;一个高效的图片格式转换工具就显得尤为关键。…...

自动驾驶规划与控制技术解析

目录 1. 自动驾驶技术 2.定位location 3. 地图HD Map ​4 预测prediction 5 自动驾驶路径规划 6. 自动驾驶路径规划 7. 规划planning 8. 视频路径 1. 自动驾驶技术 2.定位location 3. 地图HD Map 4 预测prediction 5 自动驾驶路径规划 6. 自动驾驶路径规划 7. 规划…...

计算机等级考试常见问题

目录 计算机二级报什么好? 计算机等级考试可以直接考4级吗 计算机等级考试包括什么...

C语言实战项目--贪吃蛇

贪吃蛇是久负盛名的游戏之一&#xff0c;它也和俄罗斯⽅块&#xff0c;扫雷等游戏位列经典游戏的行列。在编程语言的教学中&#xff0c;我们以贪吃蛇为例&#xff0c;从设计到代码实现来提升大家的编程能⼒和逻辑能⼒。 在本篇讲解中&#xff0c;我们会看到很多陌生的知识&…...

【LAMMPS学习】八、基础知识(5.3)Body particles体粒子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...

【3D目标检测】常见相关指标说明

一、mAP指标 mean Average Precision&#xff08;平均精度均值&#xff09;&#xff0c;它是目标检测和信息检索等任务中的重要性能指标。mAP 通过综合考虑精度和召回率来衡量模型的总体性能。 1.1 精度&#xff08;Precision&#xff09; 表示检索到的目标中实际为正确目标…...

QT设计模式:工厂模式

基本概念 工厂模式是一种创建型设计模式&#xff0c;用于将对象的创建逻辑与使用者分离&#xff0c;以实现对象的创建和使用的解耦。工厂模式提供了一个统一的接口来创建对象&#xff0c;而客户端代码只需通过该接口来请求所需的对象&#xff0c;而不需要知道具体的对象创建细…...

【电路笔记】-容抗

容抗 文章目录 容抗1、概述2、容抗示例13、容抗示例 24、容抗示例 35、分压器修订6、总结1、概述 容抗是电容器的复阻抗,其值随应用频率而变化。 与不依赖于频率的电阻不同,在交流电路中,电抗受电源频率的影响,并且其行为方式与电阻类似,两者都以欧姆为单位测量。 电抗会…...

基于若依框架搭建网站的开发日志(一):若依框架搭建、启动、部署

RuoYi&#xff08;基于SpringBoot开发的轻量级Java快速开发框架&#xff09; 链接&#xff1a;开源地址 若依是一款开源的基于VueSpringCloud的微服务后台管理系统&#xff08;也有SpringBoot版本&#xff09;&#xff0c;集成了用户管理、权限管理、定时任务、前端表单生成等…...

Android中Fragment失去焦点的场景

在Android开发中&#xff0c;Fragment的生命周期方法onPause()会在以下几种情况下被调用&#xff1a; 当Fragment所在的Activity开始与其他Activity进行交互时&#xff0c;例如按下Home键或其他Activity获得焦点&#xff0c;导致当前Activity失去焦点&#xff0c;从而使得所有关…...

Linux变量的认识及环境变量配置详解

文章目录 1、变量的划分2、局部变量3、全局变量4、环境变量4.1、概述4.2、配置临时环境变量4.3、配置永久环境变量4.3.1、用户级配置文件1&#xff09;配置方法一&#xff1a;~/.bashrc文件2&#xff09;配置方法二&#xff1a;~/.profile文件3&#xff09;配置方法三&#xff…...

【excel】数据非数值导致排序失效

场景 存在待排序列的数值列&#xff0c;但排序失效&#xff0c;提示类型有问题&#xff1a; 解决 选中该列&#xff0c;数据→分列 而后发现提示消失&#xff0c;识别为数字&#xff0c;可正常排序。...

软件网关--Nginx

Nginx 的多功能用途 Nginx 是构建现代化分布式应用程序的重要工具&#xff0c;它的功能远不止于高性能的 Web 服务器和反向代理。它还能充当 API 网关&#xff0c;处理前后端通信、认证、授权、监控等任务。以下是 Nginx 的主要用途&#xff1a; 前后端通信代理&#xff1a;N…...

sourceTree push失败

新电脑选择commit and push&#xff0c;报错了&#xff0c;不过commit成功&#xff0c;只不过push失败了。 原因是这个&#xff0c;PuTTYs cache and carry on connecting. 这里的ssh选择的是 PuTTY/Plink&#xff0c;本地没有这个ssh密钥&#xff0c;改换成openSSH&#xff…...

leetCode33. 搜索旋转排序数组

leetCode33. 搜索旋转排序数组 题目思路 此题的特点是&#xff1a;排好序循环的数组&#xff1a;特点&#xff1a;可以分为两个区间&#xff0c;一半升序&#xff0c;一半降序&#xff0c;或者全部升序 我们可以用二分法&#xff0c;找出升序 到降序的那个临界值&#xff0c;并…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...