40、网络编程/TCP和UDP通信模型练习20240229

一、使用TCP模型创建服务器和客户端完成简单通信。

服务器代码:

#include<myhead.h>
#define SER_IP "192.168.32.130"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//1.创建监听的套接字int sfd=-1;sfd=socket(AF_INET,SOCK_STREAM,0);//参数1表示使用的是ipv4的通信//参数2表示使用tcp通信类型//表示前面以及特定了通信协议if(sfd==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//2.绑定ip地址和端口号struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.启动监听 允许客户端链接if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.当有客户端发来连接请求后 创建新的用于通信的套接字struct sockaddr_in cin;socklen_t socklen=sizeof(cin);int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd==-1){perror("accept error");return -1;}printf("newfd=%d 有新客户以及上线\n",newfd);printf("客户端IP:%s,端口:%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));//5.通信套接字和客户端进行数据收发char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int res=recv(newfd,rbuf,sizeof(rbuf),0);if(res==0){puts("客户端已下线");break;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);strcat(rbuf,"*_*");send(newfd,rbuf,strlen(rbuf),0);}//6.关闭套接字close(newfd);close(sfd);return 0;
}

客户端代码:

#include<myhead.h>
#define SER_IP "192.168.32.130"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//1.创建用于通信的套接字文件描述符int cfd =socket(AF_INET,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.绑定(非必须)	//3.链接服务器struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//4.数据收发char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;send(cfd,wbuf,strlen(wbuf),0);printf("发送成功\n");if(strcmp(wbuf,"quit")==0)break;bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到消息:%s\n",wbuf);}//5.关闭套接字close(cfd);return 0;
}

运行:

二、使用UDP模型 创建服务器和客户端完成简单通信。

服务器代码:

#include<myhead.h>
#define SER_IP "192.168.32.130"
#define SER_PORT 6666
int main(int argc, const char *argv[])
{//创建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//定义通用地址结构体存入服务器地址信息struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//绑定端口号和ipif(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//定义通用地址结构体用来获取发来信息的对端地址struct sockaddr_in cin;socklen_t cinlen=sizeof(cin);char sbuf[128]="";while(1){bzero(sbuf,sizeof(bzero));//接收信息并获取对方地址recvfrom(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,&cinlen);printf("收到消息:%s\n",sbuf);strcat(sbuf,"*_*");//回复信息sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,cinlen);}close(sfd);//关闭套接字文件return 0;
}

客户端代码:

#include<myhead.h>
#define SER_IP "192.168.32.130"//客户端ip
#define SER_PORT 6666   //客户端端口号
int main(int argc, const char *argv[])
{int rfd=socket(AF_INET,SOCK_DGRAM,0);//创建套接字if(rfd==-1){perror("socket error");return -1;}//将服务器的信息存入地址通用结构体struct sockaddr_in sin;sin.sin_family =AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);char sbuf[128]="";while(1){bzero(sbuf,sizeof(sbuf));printf("请输入>>>:");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//发送信息给服务器sendto(rfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));bzero(sbuf,sizeof(sbuf));//接收对端服务器回复的信息 不接收对端地址信息recvfrom(rfd,sbuf,sizeof(sbuf),0,NULL,NULL);printf("收到信息:%s\n",sbuf);}close(rfd);//关闭套接字return 0;
}

运行:

思维导图:

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

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

相关文章

Vue2:用node+express部署Vue项目

一、编译项目 命令 npm run build执行命令后&#xff0c;我们会在项目文件夹中看到如下生成的文件 二、部署Vue项目 接上一篇&#xff0c;nodeexpress编写轻量级服务 1、在demo中创建static文件夹 2、将dist目录中的文件放入static中 3、修改server.js文件 关键配置&…

代码随想录算法训练营第四十六天 139.单词拆分、多重背包(了解)、 背包总结

代码随想录算法训练营第四十六天 | 139.单词拆分、多重背包&#xff08;了解&#xff09;、 背包总结 139.单词拆分 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean wordBreak(String s, List<String> wo…

网络编程 io_uring

io_uring 1、概述 io_uring是Linux&#xff08;内核版本在5.1以后&#xff09;在2019年加入到内核中的一种新型的异步I/O模型&#xff1b; io_uring使用共享内存&#xff0c;解决高IOPS场景中的用户态和内核态的切换过程&#xff0c;减少系统调用&#xff1b;用户可以直接向…

百度SEO快排原理是什么?如何快速排名方法?

前言&#xff1a;我之前说过我不打算写这个快速排序。 首先&#xff0c;我从来没有在自己的网站上操作过所谓的快速排序。 其次&#xff0c;我不能像网上很多人写的那样透露百度快速排序的秘密&#xff08;说实话&#xff0c;你可以透露秘密&#xff09;。 方法是有了&#xff…

Windows 11 23H2 based Tiny11 2311 中文输入法出错

参考&#xff1a; 1&#xff1a; Chinese IME dictionaries shows "not ready yet" in Windows Server 2022 - Windows Server | Microsoft Learn 2&#xff1a; Chinese basic typing not completing download - Microsoft Community 安装了 Tiny11 2311&#xff…

13. Springboot集成Protobuf

目录 1、前言 2、Protobuf简介 2.1、核心思想 2.2、Protobuf是如何工作的&#xff1f; 2.3、如何使用 Protoc 生成代码&#xff1f; 3、Springboot集成 3.1、引入依赖 3.2、定义Proto文件 3.3、Protobuf生成Java代码 3.4、配置Protobuf的序列化和反序列化 3.5、定义…

烧脑问题解决办法:如何选择一款合适自己的手机流量卡

现在社会人们越来越离不开手机了&#xff0c;手机给我们生活带来了翻天覆地的变化&#xff0c;手机需要最多的就是流量了&#xff0c;所以选择一款合适自己的手机流量卡就显得尤为重要了&#xff0c;今天小编就给大家来分享一下我的经验&#xff0c;希望对大家能有帮助&#xf…

【机器学习】FashionMNIST数据集简介及下载方法(自动下载)

【机器学习】FashionMNIST数据集简介及下载方法(自动下载) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

[c 语言] 大端,小端;网络序,主机序

在网络编程中&#xff0c;特别是底层网卡驱动开发时&#xff0c;常常遇到字节序问题。字节序指的是多字节数据类型在内存中存放的顺序&#xff0c;高位保存在低地址还是高地址&#xff0c;以此来划分大端还是小端。 1 大端和小端 大端和小端指的是 cpu 的属性&#xff0c;常见…

Linux命名管道

Linux匿名管道-CSDN博客 目录 1.原理 2.接口实现 3.模拟日志 Linux匿名管道-CSDN博客 这上面叫的是匿名管道&#xff0c;不要将两者搞混&#xff0c;匿名管道说的是两个有血缘关系的进程相互通信&#xff0c;但是命名管道就是两个没有关系的管道相互通信。 1.原理 和匿名…

智能驾驶规划控制理论学习03-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…

Docker知识点总结二

四、 Docker 架构 Docker使用客户端-服务器(C/S)架构模式&#xff0c;使用远程API来管理和创建Docker容器。 介绍&#xff1a; 1、Docker的客户端client&#xff0c;我们在命令行发送一些信息(命令)给Docker服务端。2、中间这个就是Docker的服务端&#xff0c;在这个服务端里面…