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 示例:为套接字fd绑定通信结构体addr 2.3 listen函数 与 accept函数 …...
小剧场短剧影视小程序源码_后端PHP
项目运行截图 源码贡献 https://githubs.xyz/boot?app42 部署说明 linux/win任选 PHP版本:7.3/7.2(测试时我用的7.2要安装sg扩展 ) 批量替换域名http://video.owoii.com更换为你的 批量替换域名http://120.79.77.163:1更换为你的 这两个…...
C语言总结三:数组(压缩版)
一,数组概念 定义:相同类型元素的集合 二,一维数组 1,语法:type arr_name[常量值]; 2,初始化:int arr[5]{1,2,3,4,5}; 3,类型:int [5] 4,使用࿱…...
我独自升级崛起怎么玩 我独自升级崛起游玩教程分享
《我独自升级:ARISE》是一款预计在 Android、iOS 和 PC 平台推出的动作 RPG,故事内容基于网络漫画版本改编,讲述世界各地出现「次元传送门」,而少部分人类觉醒了可以对抗传送门中怪物的「猎人」能力,玩家可以在故事模式…...
前端上传大文件
在前端实现大文件上传,通常涉及以下几个关键步骤和技术要点,以确保上传过程既高效又稳定: 1. 文件切片 目的:将大文件分割成多个小块,以减少单次请求的负担,提高上传速度,并且增强上传的稳定性…...
Kompas AI图片转换器:高效解决格式不兼容问题
最新Kompas AI:一键转换图片格式,提升工作效率 在数字化的世界里,图片已成为我们交流和分享信息不可或缺的媒介。然而,不同的场景往往需要不同格式的图片,这时,一个高效的图片格式转换工具就显得尤为关键。…...
自动驾驶规划与控制技术解析
目录 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语言实战项目--贪吃蛇
贪吃蛇是久负盛名的游戏之一,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的行列。在编程语言的教学中,我们以贪吃蛇为例,从设计到代码实现来提升大家的编程能⼒和逻辑能⼒。 在本篇讲解中,我们会看到很多陌生的知识&…...
【LAMMPS学习】八、基础知识(5.3)Body particles体粒子
8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...
【3D目标检测】常见相关指标说明
一、mAP指标 mean Average Precision(平均精度均值),它是目标检测和信息检索等任务中的重要性能指标。mAP 通过综合考虑精度和召回率来衡量模型的总体性能。 1.1 精度(Precision) 表示检索到的目标中实际为正确目标…...
QT设计模式:工厂模式
基本概念 工厂模式是一种创建型设计模式,用于将对象的创建逻辑与使用者分离,以实现对象的创建和使用的解耦。工厂模式提供了一个统一的接口来创建对象,而客户端代码只需通过该接口来请求所需的对象,而不需要知道具体的对象创建细…...
【电路笔记】-容抗
容抗 文章目录 容抗1、概述2、容抗示例13、容抗示例 24、容抗示例 35、分压器修订6、总结1、概述 容抗是电容器的复阻抗,其值随应用频率而变化。 与不依赖于频率的电阻不同,在交流电路中,电抗受电源频率的影响,并且其行为方式与电阻类似,两者都以欧姆为单位测量。 电抗会…...
基于若依框架搭建网站的开发日志(一):若依框架搭建、启动、部署
RuoYi(基于SpringBoot开发的轻量级Java快速开发框架) 链接:开源地址 若依是一款开源的基于VueSpringCloud的微服务后台管理系统(也有SpringBoot版本),集成了用户管理、权限管理、定时任务、前端表单生成等…...
Android中Fragment失去焦点的场景
在Android开发中,Fragment的生命周期方法onPause()会在以下几种情况下被调用: 当Fragment所在的Activity开始与其他Activity进行交互时,例如按下Home键或其他Activity获得焦点,导致当前Activity失去焦点,从而使得所有关…...
Linux变量的认识及环境变量配置详解
文章目录 1、变量的划分2、局部变量3、全局变量4、环境变量4.1、概述4.2、配置临时环境变量4.3、配置永久环境变量4.3.1、用户级配置文件1)配置方法一:~/.bashrc文件2)配置方法二:~/.profile文件3)配置方法三ÿ…...
【excel】数据非数值导致排序失效
场景 存在待排序列的数值列,但排序失效,提示类型有问题: 解决 选中该列,数据→分列 而后发现提示消失,识别为数字,可正常排序。...
软件网关--Nginx
Nginx 的多功能用途 Nginx 是构建现代化分布式应用程序的重要工具,它的功能远不止于高性能的 Web 服务器和反向代理。它还能充当 API 网关,处理前后端通信、认证、授权、监控等任务。以下是 Nginx 的主要用途: 前后端通信代理:N…...
sourceTree push失败
新电脑选择commit and push,报错了,不过commit成功,只不过push失败了。 原因是这个,PuTTYs cache and carry on connecting. 这里的ssh选择的是 PuTTY/Plink,本地没有这个ssh密钥,改换成openSSHÿ…...
leetCode33. 搜索旋转排序数组
leetCode33. 搜索旋转排序数组 题目思路 此题的特点是:排好序循环的数组:特点:可以分为两个区间,一半升序,一半降序,或者全部升序 我们可以用二分法,找出升序 到降序的那个临界值,并…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
