Ubtuntu+C语言实现网络通信附源代码

2023-05-16

下面这个案例是我用C在ubtuntu上面写的网络编程案例。
2. 网络编程
(1)OSI七层模型理想化
应用层:app,应用程序。
表示层:对数据进行加工。
会话层:建立会话。(比如电脑之间通信,就会建立会话,跟不同电脑通信,都会建立不同的会话)。
传输层:保证数据能够可靠传输。
网络层 :路由选择 (可以实现不同局域网之间的互联)。
数据链路层 :局域网之间的数据传输。
物理层:决定传输介质。
(2) TCP/IP四层模型(TCP/IP协议簇)
Tcp协议:用来实现数据的可靠传输。
UDP:传输数据不可靠。
IP协议:对于不同的局域网之间互联的协议。
应用层:对应理想化模型的应用层,表示层,会话层。
//http协议:发出请求的协议。
//dns协议,域名解析协议。
tftp:文件传输协议
传输层:TCP/UDP
网络层:IP
网络接口和物理层://以太网
(3) 协议:通信规则。目的:能够进行有目的的通信。
套接字:(socket)提供网络通信的编程接口。是一个特殊的文件(s)。
套接字位于传输层和应用层之间。
IP地址:软件层次或者网络里主机的唯一标识。192.168.1.45:前三个一样表示在一个局域网。
2~254我们可以使用,0,1,255比较特殊。
端口号:区分同一台电脑上的不同的进程,进程是能够进行网络通信的进程。
端口号就是确定是哪个端口在通信
范围:0~65535,1024以后就可以使用了。
字节序:就是大于一个字节类型的数据在内存中存放顺序。
Big-Endian:大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
Little-Endian:小端:低位字节排放在内存的低地址端,高位字节排放在内存的高地址段。
MAC地址:全世界唯一的地址
(4) TCP和UDP区别:
TCP:可靠,有连接。
UDP:无连接,不可靠。
TCP的有连接的是通过三次握手和四次挥手来实现的。
客户端:请求服务的一方,主动。
服务器:提供服务的一方,被动。
TCP三次握手:
1、客户端向服务器发出连接请求。
2、服务器应答,并且向客户端发出连接请求。
3、客户端应答
TCP四次挥手:
1、客户端向服务器发出断开请求。
2、服务器应答。
3、服务器向客户端发出断开连接请求。
4、客户端应答。
(5)搭建模型
服务器创建流程:
1、创建一个套接字(主动)。Socket
2、绑定IP地址和端口号。bind
3、 创建监听队列使套接字变成被动的套接字。listen
4、等待和客户端连接。Accept
5、通信。Read/write recv/send
6、关闭套接字。Close
服务器代码:
1.socket
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
参数1:地址族

参数2:套接字类型:(TCP)SOCK_STREAM(流式),(UDP)SOCK_DGRAM (数据报),SOCK_RAW。
参数3:一般为0,代表自动匹配协议。
返回值:创建成功返回套接字。

3.Bind
#include<sys/types.h>
#include<sys/socket.h>
Int bind(int sockfd,const struct sockaddr*addr,socklen_t addrlen);
参数1:创建成功的套接字。
参数2:要绑定的ip和端口的信息。
参数3:ip和端口填充的结构体的大小。
返回值:绑定成功返回0,失败返回-1。
Struct socketaddr{
Sa_family_t sa_family;
Char sa_data[14];
}

Struct sockaddr_in{
U_short sin_family; //地址族
U_short sin_port; //端口号 11023被占用,102449151
Struct in_addr sin_addr;//ipv4地址
Char sin_zero[8];//填充位
};
#include<arpa/inet.h>

3、listen
#include<sys/types.h>
#include<sys/socket.h>
Int listen(int sockfd,int backlog);
参数1:套接字
参数2:监听的个数
参数3:监听成功返回0,失败返回-1.
4.Accept
#include<sys/types.h>
#include<sys/socket.h>
int accept(sockfd,struct sockaddr addr,socklen_taddrlen);
返回值:连接成功返回套接字,这个套接字是用来进行数据收发,连接失败返回-1。
5、send/recv
#include<sys/types.h>
#include<sys/socket .h>
Ssize_t recv(int socketfd,void *buf,size_t len,int flags);
参数1:accept函数的返回值。
参数2:数据缓存区 哟隔开保存收到的数据。
参数3:一次性接收多大的数据。
参数4:通常为0,阻塞模式接收数据。

6、Send
#include<sys/types.h>
#include<sys/socket.h>
Ssize_t send(int sockfd,const void *buf,size_t len,int flags);
1.参数1:accept函数的返回值。
2.参数2:数据缓存区,保存着要发送的数据。
3.一次性发送多大的数据。
4.通常为0 阻塞模式发数据。

      返回值:成功返回实际发送字节数,失败返回-1.

客户端的流程:
1、创建一个套接字(主动)。
2、向服务器发出连接请求。
3、通信。
4、关闭套接字。
服务器端:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>

int main()
{
        //1.chuangjiantaojiezi
        int sockFd = socket(AF_INET,SOCK_STREAM,0);
        if(sockFd < 0)
        {
                printf("socket failed!");
                return -1;

        }
        printf("socket success!\n");

        //2.bangdingduankou
        struct sockaddr_in serAddr;
		 memset(&serAddr,0,sizeof(serAddr));
        serAddr.sin_family = AF_INET;
        serAddr.sin_port = htons(10086);
        serAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        int ret = bind(sockFd,(struct sockaddr *)&serAddr,sizeof(serAddr));
        if(ret < 0)
        {
                printf("bind failed!\n");
                close(sockFd);
                return -1;
        }
        printf("bind success!\n");
        //3.jiantingduilie
        ret = listen(sockFd,5);
        if(ret < 0)
        {
                printf("listen failed!\n");
                close(sockFd);
                return -1;

		}
        printf("listen success!\n");

        //4.dengdaikehuduanfachulianjieqingqiu
        struct sockaddr_in stClient;
        memset(&stClient,0,sizeof(stClient));
        socklen_t len = sizeof(stClient);
        while(1){

                int iClient = accept(sockFd,(struct sockaddr *)&stClient,&len);
                if(iClient < 0)

                {
                        printf("accept failed!\n");
                        close(sockFd);
                        return -1;
                }
                printf("accept sucess!\n");
                //5.recv
                char buf[1024] = {0};
                while(1)
				 {
                        ret = recv(iClient,buf,sizeof(buf),0);
                        if (ret > 0)
                        {
                                printf("recv ok!\n");
                                printf("%s\n",buf);
                        }
                        else if(ret < 0)
                        {
                                printf("recv error!\n");
                                close(iClient);
                                close(sockFd);
                                return -1;
                        }
                        else
                        {
                                printf("read over!");
                                break;
                        }
                        ret = send(iClient,buf,strlen(buf),0);
                        if(ret < 0)
                        {
                                printf("send error!");
                                close(sockFd);
                                close(iClient);
                                return -1;

                        }
                        printf("send ok!\n");

                }
                //6.close
                close(iClient);
        }
        close(sockFd);
        return 0;
}

客户端:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<strings.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>

int main()
{
        //1.socket
        int sockFd = socket(AF_INET,SOCK_STREAM,0);
        if(sockFd <0)
        {
                printf("socket failed!\n");
                return -1;
        }
        printf("socket success!\n");
    
        //2.connnect
        struct sockaddr_in stServer;
        memset(&stServer,0,sizeof(stServer));
        stServer.sin_family = AF_INET;
        stServer.sin_port = htons(10086);
        stServer.sin_addr.s_addr = inet_addr("127.0.0.1");
        int ret = connect(sockFd,(struct sockaddr *)&stServer,sizeof(stServer));
        if(ret <0)
        {
                printf("connect failed!\n");
                close(sockFd);
                return -1;
        }
        printf("connect failed\n");
        char buf[1024] = {0};
        char recv_buf[1024] = {0};
        while(1)
        {
                memset(buf,0,sizeof(buf));
                printf("input:");
                fgets(buf,1023,stdin);
                if((strcmp(buf,"quit\n"))==0)
                {
                        printf("Exit!\n");
                        break;
                }


		}
                ret = send(sockFd,buf,strlen(buf),0);
                if(ret<0)
                {
                        printf("send failed!\n");
                        close(sockFd);
                        return -1;
                }
                printf("send ok!\n");
                memset(recv_buf,0,sizeof(recv_buf));
                ret = recv(sockFd,recv_buf,sizeof(recv_buf),0);
                if(ret<0)
                {
                        printf("recv error!\n");
                        close(sockFd);
                        return -1;
                }
                printf("recv ok! recv:%s\n",recv_buf);
        }
        close(sockFd);
        return 0;

}

运行结果:
在这里插入图片描述

这是我以前用Python写的网络编程的案例,大家可以看看
https://blog.csdn.net/qq_44176343/article/details/113807144?spm=1001.2014.3001.5502
Python网络编程案例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubtuntu+C语言实现网络通信附源代码 的相关文章

  • 通过onvif抓取海康摄像头图片,以及解决海康摄像头抓取图片需要验证问题,实现摄像头一段时间换一个地方的同时抓取一张图片。

    1 实现海康摄像头的图片的抓取 思路 xff1a 1 首先获取图片的url xff0c 2通过java实现图片的下载 1 使用onvif获取图片的url 首先获取OnvifDevice的对象 OnvifDevice od 61 new On
  • 超详细电烙铁如何使用?

    电烙铁是电子硬件工程师的一个必备工具了 它主要用来焊接一些电子元器件到PCB主板上 xff0c 用来做一些维修 xff0c 验证 xff0c 分析等等 那这么一个家伙要如何使用呢 xff1f 首先来看一个电烙铁的基本外观 xff1a 它一般
  • Makefile和cmake学习

    一 Makefile 一 什么是Makefile 1 Makefile 可以简单的认为是一个工程文件的编译规则 xff0c 描述了整个工程的编译和链接等规则 其中包含了那些文件需要编译 xff0c 那些文件不需要编译 xff0c 那些文件需
  • Ros下编译某功能包时出现很多“未定义的引用”的解决方法(本人版本是ubuntu18.04)

    问题描述 xff1a 在工作空间下编译某功能包时出现 在函数 中未被定义等问题 xff0c 如图所示 解决方案 xff1a 第一步 xff1a 查看自己的gcc版本和g 43 43 版本是否一致 xff0c 打开终端输入以下命令 gcc v
  • STM32—串口通讯详解

    串口通讯目录 物理层协议层USART简介开发板与上位机的连接代码讲解 xff1a 一 初始化结构体二 NVIC配置中断优先级三 USART配置函数讲解四 传输数据的函数 xff1a 1 发送一个字节2 发送字符串3 重定向printf函数发
  • 二进制数的算术运算和逻辑运算

    算术运算 二进制数加法采用逢二进一 减法采用借一作二 十六进制数加法采用逢十六进一 减法采用借一作十六 1位八进制可以写成3位二进制 xff0c 因为3位二进制可以表示十进制范围0 7 xff0c 也就是1位八进制的表示范围 1位十六进制可
  • STM32串口接收一帧数据方法(处理一帧数据中所需内容)

    stm32支持接受单个数据或者一帧数据 xff0c 若配置单个数据接收中断的话 xff0c 会出现接收包丢包 xff0c 数据不完整的情况 xff01 因此在stm32的串口中断中 xff0c 还有一个IDLE中断 xff0c 用来产生串口
  • 使用火狐拓展插件以及运行脚本的超详细方法

    1 首先我们需要下载火狐浏览器 火狐浏览器官网 xff1a 火狐浏览器 打开后默认页面 xff1a 2 如图所示点击右上角打开菜单 xff0c 然后点击附加组件 xff1a 3 进入该页面后在搜索框输入 xff1a tampermonkey
  • static关键字在c/c++中的作用

    static关键字在c c 43 43 中的作用 static在c语言中有三个作用 xff1a 修饰函数 修饰局部变量 修饰全局变量 被static修饰的全局变量被称之为静态全局变量 静态全局变量和全局变量在存储方式上是一致的 xff0c
  • licurl API

    这个文档是小编在curl官网上使用谷歌翻译翻译的 xff0c 详细信息看官网 curl 描述 这是关于C程序中如何使用libcurl的简单概述 xff0c libcurl程序的使用需要通过以下5个方面libcurl easy libcurl
  • C语言:最大公约数详解

    C语言 xff1a 最大公约数详解 Hello xff01 小伙伴们大家好 xff0c 几天不见了 xff0c 今天给大家分享一下C语言中求最大公约数的三种方法 在开始分享前 xff0c 让我们先来看看什么是最大公约数 xff1a 最大公约
  • Java:遍历数组的三种方法

    1 for循环遍历数组 用for循环遍历数组是很常见的一种方法 xff0c Java语言中通过数组的length属性可获得数组的长度 span class token keyword package span demo span class
  • Linux:进程创建详解

    Linux xff1a 进程创建详解 进程创建1 fork函数写时拷贝调用失败的原因 2 vfork函数 进程终止正常退出的三种方法 exit和exit的区别 进程创建 现在我们已经知道进程的概念以及怎样创建一个进程 xff0c 接下来我们
  • Linux:简单理解文件系统内附Linux内核设计与实现PDF下载地址

    简单理解文件系统 文件系统ext2文件系统文件的存储文件的获取 文件系统 文件存储的方式有线性存储和离散存储两种 xff0c 线性存储可能会导致磁盘的利用率降低 xff0c 产生磁盘碎片 xff0c 离散存储方式会提高程序对磁盘的利用率 x
  • Linux:网络编程——UDP编程的前期准备

    Linux xff1a 网络编程 UDP编程的前期准备 字节序TCP与UDP的区别UDP编程的流程1 创建套接字创建套接字的意义 2 绑定地址信息 xff08 1 xff09 绑定ip和端口 xff08 2 xff09 函数 3 UDP发送
  • Xshell连接虚拟机时报错Could not connect to ‘192.168.115.133‘ (port 22): Connection failed.

    Xshell连接虚拟机时报错Could not connect to 192 168 115 133 port 22 Connection failed 今天突然想把拨号连接换成宽带连接 结果问题就来了 用下Xshell连接虚拟机的时候一直
  • Linux:简单三步,教你解决ping:www.baidu.com:未知的名称或者服务

    Linux xff1a 简单三步 xff0c 教你解决ping www baidu com 未知的名称或者服务 1 在VMware Workstation中点开编辑 xff0c 找到虚拟网络编辑器2 直接点击更改设置3 点击还原默认设置 x
  • C++:从结构体开始理解this指针

    C 43 43 xff1a 从结构体开始理解this指针 span class token macro property span class token directive keyword include span span class
  • 原来直接插入排序这么简单(附完整代码)

    原来插入排序这么简单 附完整代码 xff09 基本思想带哨兵位的插入排序二分插入排序完整代码 基本思想 做一件是之前我们总是要先知道我们做这件的核心思想 xff0c 这样会让我们做事的效率得到有效的提高 xff1b 现在我们来看看插入排序算

随机推荐

  • 一张图带你了解c/c++的内存分布

    c c 43 43 的内存分布 对照这些代码查看对应内存分布 xff1a span class token keyword int span globalVar span class token operator 61 span span
  • 用一个例子理解希尔排序

    用一个例子理解希尔排序 思想代码 思想 希尔排序是把序列按下标的一定增量分组 xff0c 对每组使用直接插入排序算法排序 xff1b 随着增量的逐渐减少 xff0c 每组包含的关键词越来越多 xff0c 当增量减至1时 xff0c 整个序列
  • c++ pi

    C 43 43 中表示pi的方法有两种 xff08 1 xff09 math库中利用arctan函数算出 span class token function tan span span class token punctuation spa
  • 【非数值数据的编码】西文字符和汉字的编码表示 汉字国标码、机内码详细理解

    西文字符和汉字的编码表示 西文字符概念ASCII码表特点 西文字符特点西文字符表示 xff08 常用编码为7位ASCII码 xff09 西文字符操作 汉字字符编码形式输入码字符集与汉字内码汉字的区位码汉字的国标码汉字内码 汉字的字模点阵码和
  • 修改centos7系统用户最大线程数和最大文件数限制

    修改centos7系统用户最大线程数和最大文件数限制 需要注意 xff0c 不同版本的Linux系统所对应的修改方法不同 ulimit 的作用 ulimit xff1a 显示 xff08 或设置 xff09 用户可以使用的资源的限制 xff
  • (已全部解决)ubantu18运行vins遇到的问题

    1 sudo rosdep init时报错 xff1a 打开hosts文件 sudo gedit etc hosts 在文件末尾添加 151 101 84 133 raw githubusercontent com 保存后退出再尝试 sud
  • ROS只使用思岚A1激光雷达进行slam建图

    使用思岚A1激光雷达 A1的ros功能包下载地址 xff1a https github com slamtec rplidar ros 因为只有激光雷达 xff0c 需要其做SLAM的话 xff0c 就需要有一个laser scan mat
  • STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计

    1 系列总述 从现在开始将会进入四轴无人机的制作 xff0c 我是第一次制作四旋翼 xff0c 从前没有接触过这个方面 xff0c 手边的参考资料只有一本四轴的设计书和正点原子F405飞控的源码 xff0c 所以代码逻辑设计方面肯定有所欠缺
  • 【C++基础】inline与内联函数

    目录 引入 inline 关键字inline使用限制类中的成员函数与inline 引入 inline 关键字 为了解决一些频繁调用的小函数大量消耗栈空间 xff08 栈内存 xff09 的问题 xff0c 特别的引入了 inline 修饰符
  • 串口通信的基本原理详解

    目录 串口通信 串口通信的两种基本方式 异步数据的数据发送过程 异步通信的数据接收过程 9针串口 xff08 DB9 xff09 TTL与RS232区别 TTL RS232 xff1a 串口通信的数据格式 通讯方式 偶校验与奇校验 停止位
  • jeston nano安装Ubuntu镜像时启动遇到问题

    A start job is running for End user configuration after initial OEM installation 开始我跑了一下午 43 一晚上 xff0c 都没成功 xff0c 第二天 xf
  • cmake 常用变量、常用环境变量、常用语法总结

    一 cmake 变量引用的方式 前面我们已经提到了 使用 进行变量的引用 在 IF 等语句中 是直接使用变量名而不通过 取值 二 cmake 自定义变量的方式 主要有隐式定义和显式定义两种 隐式定义的例子 xff1a PROJECT 指令
  • Java基础篇:Iterator迭代器

    一 什么是Iterator xff1a 迭代器 Iterator 是一个对象 xff0c 它的工作是遍历并目标序列中的对象 xff0c 它提供了一种访问一个容器 container 对象中的各个元素的方法 xff0c 把访问逻辑从不同类型的
  • 2022-2-19 ros环境变量

    学习时间及标题 xff1a 2022 2 19 ros环境变量 学习内容 xff1a 1 添加环境变量 xff1a source span class token operator span span class token operato
  • EGO-Planner: An ESDF-free Gradient-based Local Planner for Quadrotors(论文学习)

    EGO规划器 xff1a 一种基于ESDF自由梯度的四转子局部规划器 摘要 ESDF地图被广泛运用在局部地图的梯度方向和大小估计之中 xff0c 但是由于我们在进行轨迹优化的过程中 xff0c 只用到了ESDF地图中很小的一部分 xff0c
  • cmake "undefined reference to"

    main函数在调用其他 c或 cpp文件的函数时 xff0c 有以下几种情况 函数名写错 没有将其他 c或 cpp文件链接到main o xff0c 导致main函数在执行时找不到需要调用的函数 的解决方法 修改CMakeLists txt
  • STM32串口详解

    实验一 xff1a 简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手 xff0c 还应知道 xff1a 发送英文字符需要用一个字符即8位 xff0c 发送汉字需要两个字符即16位 xff0c 如上图 xff0c 发送汉字 姜
  • RLException: [xx.launch] is neither a launch file in package [x] nor is [x] a launch file name的解决方法

    ROS学习过程中 xff0c 遇到问题 xff1a RLException xx launch is neither a launch file in package x nor is x a launch file name 出现的问题
  • numpy 中 shape 与 size 属性

    因为需要生成一个和现有矩阵大小相等的矩阵 xff0c 故查找了相关资料 span class token operator gt gt span span class token operator gt span span class to
  • Ubtuntu+C语言实现网络通信附源代码

    下面这个案例是我用C在ubtuntu上面写的网络编程案例 2 网络编程 xff08 1 xff09 OSI七层模型理想化 应用层 xff1a app xff0c 应用程序 表示层 xff1a 对数据进行加工 会话层 xff1a 建立会话 x