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. 搜索旋转排序数组 题目思路 此题的特点是:排好序循环的数组:特点:可以分为两个区间,一半升序,一半降序,或者全部升序 我们可以用二分法,找出升序 到降序的那个临界值,并…...
别再手动算矩阵了!CloudCompare 2025版点云变换保姆级教程(齐次/欧拉/轴角一键搞定)
别再手动算矩阵了!CloudCompare 2025版点云变换保姆级教程(齐次/欧拉/轴角一键搞定) 点云数据处理中,最让人头疼的莫过于各种空间变换操作。传统方法需要手动计算变换矩阵,不仅容易出错,还耗费大量时间。Cl…...
ARM RealView开发套件实战指南与优化技巧
1. ARM RealView开发套件概述作为一名从事嵌入式开发多年的工程师,我深知一套优秀的开发工具对项目效率的影响。ARM RealView开发套件(RVDK)是ARM公司推出的专业级嵌入式开发解决方案,专为基于ARM架构的处理器设计。这套工具链在我…...
5分钟上手biliTickerBuy:开源B站会员购抢票自动化工具终极指南
5分钟上手biliTickerBuy:开源B站会员购抢票自动化工具终极指南 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy biliTickerBuy是一款开源免费的B站会员购辅助工具,专为技…...
多语言支持秘籍:validatorjs国际化错误消息配置终极指南
多语言支持秘籍:validatorjs国际化错误消息配置终极指南 【免费下载链接】validatorjs A data validation library in JavaScript for the browser and Node.js, inspired by Laravels Validator. 项目地址: https://gitcode.com/gh_mirrors/va/validatorjs …...
英雄联盟内存换肤神器:R3nzSkin全攻略
英雄联盟内存换肤神器:R3nzSkin全攻略 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin 想要在英雄联盟中体验所有皮肤却担心账号安全?R3nzSkin为你提供了一种安全可…...
百度网盘SVIP破解插件:macOS用户突破下载限速的终极指南
百度网盘SVIP破解插件:macOS用户突破下载限速的终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 百度网盘SVIP破解插件(…...
毕业设计:基于springboot的在线课程管理系统(源码)
4系统概要设计4.1概述本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示:图4-1系统工作原理图4.2…...
基于MCP协议的本地代码历史管理工具:无感备份与即时回溯
1. 项目概述:一个为开发者打造的“时光机”如果你是一名开发者,大概率经历过这样的场景:在调试一个复杂功能时,你反复修改了一段代码,运行、测试、再修改……几个小时后,你突然意识到,两个小时前…...
3D打印操作辅助工具:自制安全高效的“过来放大器”
1. 项目概述:当3D打印遇上“过来”放大器在3D打印这个行当里折腾了这么多年,我见过各种稀奇古怪的“魔改”和“土法炼钢”,但最近一个朋友工作室里出现的一个小玩意儿,还是让我眼前一亮。他管它叫“3D打印设备专用过来放大器”。初…...
保障企业级应用安全,如何利用 Taotoken 管理 API 密钥与审计日志
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 保障企业级应用安全,如何利用 Taotoken 管理 API 密钥与审计日志 在中大型企业的开发实践中,将大模型能力集…...
