在Linux系统上实现TCP(socket)通信

一.什么TCP

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

二.TCP通信流程

三. TCP 服务器端  

1 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //SOCK_STREAM tcp通信2 绑定(bind)
struct sockaddr_in myaddr;
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(8888);
myaddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 自动提取本机ip地址
bind(sockfd, (struct sockaddr *)&myaddr, sizeof(myaddr));3 监听 (设置允许同时连接的客户端的最大值 同时连接:已经连上的,不算同时连接)
int listen(int sockfd, int backlog);
listen(sockfd, 5);4 阻塞等待连接 accept
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
sockfd :socket 的返回值
addr :客户端的ip地址和端口号存在addr中 (通常为NULL)//udp recvfrom倒数第二个参数一
样
addrlen :客户端的ip地址和端口号长度 (通常为NULL)//udp recvfrom倒数第一个参数一样
返回值(重点)
是一个newfd :(一个新的fd,此fd用来标识客户端,第一个连接的 4,下一个5,....)5 接收数据 (阻塞接收)
ssize_t recv(int newfd, void *buf, size_t len, int flags);
参数: newfd accept的返回值, newfd
buf 接收的数据存放的位置
len 将要接收的数据的长度
flags 暂时为0
返回值: 实际接收的数据的长度,如果<=0,则证明客户端已经断开连接6 发送数据
ssize_t send(int newfd, const void *buf, size_t len, int flags);
参数: newfd accept的返回值, newfd
buf 发送数据首地址
len 发送数据长度
flags 暂时为0
返回值: 实际发送的数据的长度7 关闭socket
close(newfd);
close(fd);
实例 :
server.c
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{int fd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in myaddr;myaddr.sin_family = AF_INET;myaddr.sin_port = htons(8888);myaddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 得到当前计算机的ip地址int ret = bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr));printf("ret %d\n",ret);listen(fd, 5);int newfd = accept(fd, NULL, NULL); //等待客户端连接char buf[100] = { 0 };ret = recv(newfd, buf, sizeof(buf), 0); //newfd 代表连接的客户端printf("ret %d, newfd is %d, buf is %s\n",ret, newfd, buf);close(newfd);close(fd);
}
执行:gcc hello.c -o server      ./server
另外起一个终端,执行:nc 127.0.0.1 8888 ( 模拟出一个客户端 ),在这里发送信息,服务器端就会收到信息。

四. TCP 客户端

1 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //SOCK_STREAM tcp通信 2 连接服务端
struct sockaddr_in youaddr;
youaddr.sin_family = AF_INET;
youaddr.sin_port = htons(8888);
youaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd socket的返回值
addr 保存对方的ip地址和端口
addrlen sizeof(youaddr);
返回值:成功 返回0 失败返回 -1
一旦连接成功,服务端解除阻塞(accpet)3 发送数据
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
参数:
sockfd socket的返回值
buf 发送的数据存放的位置,
len 发送的数据的长度(以字节为单位)
flags 暂时为04 接收数据 //同样用recv()5 关闭socket
close(fd);
实例 :
client.c
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{int fd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in youaddr;youaddr.sin_family = AF_INET;youaddr.sin_port = htons(8888);youaddr.sin_addr.s_addr = inet_addr("127.0.0.1");connect(fd, (struct sockaddr *)&youaddr, sizeof(youaddr));char buf[] = "hello";send(fd, buf, sizeof(buf), 0);close(fd);
}
执行:gcc hello.c -o client      ./client      
另外起一个终端,执行:nc -l 8888(模拟服务器)
之后在执行./client的终端就可以给模拟的服务器发消息了。

五.练习

  实现服务器端循环收数据打印,客户端从 main函数的 参数中提取 ip 地址和端口号 , 可以循环从键盘输入数据,发数据, 如果客户端输入 ‘0’ ,则客户端退出。
server.c   (服务器端)
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{int fd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in myaddr;myaddr.sin_family = AF_INET;myaddr.sin_port = htons(8888);myaddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 得到当前计算机的ip地址int ret = bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr));listen(fd, 5);int newfd = accept(fd, NULL, NULL); //等待客户端连接while(1){char buf[100] = { 0 };if(recv(newfd, buf, sizeof(buf), 0) > 0) //newfd 代表连接的客户端printf("buf is %s\n", buf);elsebreak;}close(fd);
}

client.c   (客户端)

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{int fd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in youaddr;youaddr.sin_family = AF_INET;youaddr.sin_port = htons(atoi(argv[2]));youaddr.sin_addr.s_addr = inet_addr(argv[1]);connect(fd, (struct sockaddr *)&youaddr, sizeof(youaddr));char buf[100] = "hello";while(1){gets(buf);if (buf[0] =='0'){break;}send(fd, buf, sizeof(buf), 0);}close(fd);
}

起两个终端一个执行服务器,一个执行客户端。

一个执行:gcc hello.c -o server      ./server

另一个执行:gcc hello.c -o client      ./client    192.168.133.5    8080     
//这里需要输入你的本地IP地址和端口号
这样客户端就能发送消息给服务器,服务器能一直接收消息。(实测成功)

六. 结语

这就是TCP套接字在Linux上使用的方法与步骤,本次的代码分享到此结束,感谢大家观看,希望大家点点赞,点点关注,后续还会发Linux系统上的TCP并发服务器(服务器能同时连多个客户端),谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理(超详解!!) 第五节 只读存储器和闪速存储器

1.只读存储器&#xff08;Read Only Memory&#xff09; 1、ROM的分类 最大优点&#xff1a;具有非易失性 掩膜ROM&#xff1a; PROM基本存储电路&#xff1a; 2.闪速存储器 FLASH存储器也翻译成闪速存储器&#xff0c;它是高密度非失易失性的读/写存储器。高密度意味着它具…

Docker 搭建私有镜像仓库

一、镜像仓库简介 Docker的镜像仓库是一个用于存储和管理Docker镜像的中央位置。镜像仓库的主要作用是提供一个集中的地方&#xff0c;让用户可以上传、下载、删除和共享Docker镜像。镜像仓库又可以分为公共镜像仓库和私有仓库镜像仓库&#xff1a; 公共镜像仓库 Docker Hub 是…

Day94:云上攻防-云服务篇弹性计算云数据库实例元数据控制角色AK控制台接管

目录 云服务-弹性计算服务器-元数据&SSRF&AK 前提条件 利用环境1&#xff1a;获取某服务器权限后横向移动 利用环境2&#xff1a;某服务器上Web资产存在SSRF漏洞 云服务-云数据库-外部连接&权限提升 云上攻防-如何利用SSRF直接打穿云上内网 知识点&#xff1…

Xinstall:让App数据一目了然的专业统计分析软件

在当今数字化时代&#xff0c;App已成为企业营销的重要阵地。为了更好地推广App并优化运营策略&#xff0c;一款强大的统计分析软件显得尤为重要。Xinstall&#xff0c;作为国内专业的App全渠道统计服务商&#xff0c;正是您理想的选择。 Xinstall至今已服务近40亿次App安装统…

直播系统的短视频直播源码,带有多功能后台系统的直播短视频平台 APP 源码。

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 此源码是一个直播系统&#xff0c;集直播、短视频等功能&#xff0c;根据市场趋势开发并推出思乐直播APP&#xff0c;APP功能丰富且可在后台管理系统进行配置&#xff0c;做到按需求来…

零基础如何闯入IT的神秘大门?

前言 随着信息技术的飞速发展&#xff0c;IT行业成为了许多有志之士梦寐以求的职业领域。但对于零基础的人来说&#xff0c;如何成功进入这个行业却是一个不小的挑战。下面&#xff0c;我将结合自身的C语言专业知识&#xff0c;为大家详细阐述一条可行的学习路径&#xff0c;并…

笔记:[dv-admin开发系列]--2.0版本环境搭建

目录 来源新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活的重要组成部分&#xff0c;而Facebook作为最知名的社交媒体平台之一&#xff0c;其成功之处备受瞩目。本文将深入解析Facebook的成功密码&#xff0c;探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

golang slice总结

目录 概述 一、什么是slice 二、slice的声明 三、slice的初始化、创建 make方式创建 创建一个包含指定长度的切片 创建一个指定长度和容量的切片 创建一个空切片 创建一个长度和容量都为 0 的切片 new方式创建 短声明初始化切片 通过一个数组来创建切片 声明一个 …

【群智能算法改进】一种改进的鹦鹉优化算法 改进鹦鹉优化器 IPO算法【Matlab代码#73】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始鹦鹉优化算法PO2. 改进后的IPO算法2.1 自适应切换因子2.2 混合柯西和高斯变异 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始鹦鹉优化算法PO 鹦鹉优化算法…

【Vue】生命周期

生命周期钩子(lifecycle-hooks) 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&a…

【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

【项目精讲】RESTful简洁描述

RESTful是什么 是一种架构风格/API设计规范将一切数据视为资源利用HTTP请求方式 POST、GET、PUT、DELETE&#xff0c;描述对资源的操作 GET 获取资源POST 新建资源PUT 更新资源DELETE 删除资源 通过HTTP响应状态码&#xff0c;描述对资源的操作结果请求数据和英大数据均为JSO…

蓝桥杯嵌入式2023年第十四届省赛主观题解析

1 题目 2 代码 /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" #include "rtc.h" #include "tim.h" #include "gpio.h"/* Private includes --…

搭建Grafana+Prometheus监控Spring Boot应用

Spring项目改造 maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency><dependency><groupId>io.micrometer</groupId><artif…

Ubuntu 20.04.06 PCL C++学习记录(二十一)【切记使用rm * -rf前先确认是否是对应文件夹】

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;测试点云下载地址 学习内容 根据欧几里得距离和需要保持的用户可自定义条件对点进…

spring02:DI(依赖注入)

spring02&#xff1a;DI&#xff08;依赖注入&#xff09; 文章目录 spring02&#xff1a;DI&#xff08;依赖注入&#xff09;前言&#xff1a;一、构造器注入二、set注入&#xff1a;1. Student类&#xff1a;2. Address类&#xff1a;3. beans.xml&#xff1a;4. MyTest&…

最新mysql8.3 保姆级 主从复制搭建教程

mysql 主从复制搭建 服务器配置表 机器ip操作系统主机192.168.31.25华为openEuler-22.03-LTS-SP3从机192.168.31.184华为openEuler-22.03-LTS-SP3从机192.168.31.228华为openEuler-22.03-LTS-SP3 1、在3台机器上安装独立的 mysql 1.1 创建myql文件夹用来存放mysql包 mkdir…

语音识别(录音与语音播报)

语音识别&#xff08;录音与语音播报&#xff09; 简介 语音识别人工智能技术的应用领域非常广泛&#xff0c;常见的应用系统有&#xff1a;语音输入系统&#xff0c;相对于键盘输入方法&#xff0c;它更符合人的日常习惯&#xff0c;也更自然、更高效&#xff1b;语音控制系…

【用户案例】太美医疗基于Apache DolphinScheduler的应用实践

大家好&#xff0c;我叫杨佳豪&#xff0c;来自于太美医疗。今天我为大家分享的是Apache DolphinScheduler在太美医疗的应用实践。今天的分享主要分为四个部分&#xff1a; 使用历程及选择理由稳定性的改造功能定制与自动化部署运维巡检与优化 使用历程及选择理由 公司介绍 …