当前位置: 首页 > news >正文

网络编程;套接字;TCP通讯;UDP通讯;0909

思维导图

TCP服务器端和客户端通讯

服务器端 代码

#include<myhead.h>
#define SER_IP "192.168.109.12"//我的虚拟机的ip
#define SER_PORT 8888
int main()
{//1.创建一个用于连接的套接字文件描述符int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}printf("sfd = %d\n",sfd);//2.给套接字绑定ip地址和的端口号//2.1准备地址信息结构体struct sockaddr_in sin;//通信域地址族sin.sin_family = AF_INET;//服务器端口号sin.sin_port = htons(SER_PORT);//2字节 主机字节序 转化为 网络字节序//服务器ip地址sin.sin_addr.s_addr = inet_addr(SER_IP);//ip地址 点分十进制 转化为 网络字节序//2.2执行绑定工作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.阻塞 等客户端的连接//4.1 定义地址信息结构体,用于客户端地址信息struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);//接收地址长度int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd==-1){perror("accept error");return -1;}printf("[%s:%d]-连接成功newfd = %d\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),newfd);//5.实现数据的收发char buf[128]="";while(1){//清空bufbzero(buf,sizeof(buf));//从套接字读取消息int res=read(newfd,buf,sizeof(buf));if(res==0){printf("客户端下线\n");close(newfd);//关闭通信套接字break;}printf("[%s:%d] : %s\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),buf);//给消息 加个:D还回去strcat(buf,":D");write(newfd,buf,strlen(buf));printf("发送成功\n");}//6.关闭套接字close(sfd);return 0;
}

客户端 代码

#include<myhead.h>
#define SER_IP "192.168.109.12"    //服务器ip地址
#define SER_PORT 8888               //服务器端口号
#define CLI_IP "192.168.109.12"     //客户端ip地址
#define CLI_PORT 7777               //客户端端口号int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、给客户端套接字绑定ip地址和端口号//2.1 填充地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_addr.s_addr = inet_addr(CLI_IP);cin.sin_port = htons(CLI_PORT);//2.2 绑定if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin))==-1){perror("bind error");return -1;}//3、连接服务器//3.1 组装对端地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;    //通信域sin.sin_addr.s_addr = inet_addr(SER_IP);   //要连接的服务器ipsin.sin_port = htons(SER_PORT);     //服务器的端口号//3.2 连接操作if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("connect error");return -1;}//4、数据通信char buf[128] = "";while(1){//从终端输入要发送的消息fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//判断输入内容if(strcmp(buf, "quit")==0){break;}//将消息发送给服务器write(cfd, buf, strlen(buf));printf("发送成功\n");//接受服务器发来的消息bzero(buf, sizeof(buf));int res = read(cfd, buf, sizeof(buf));if(res == 0){printf("服务器已经下线\n");break;}printf("收到服务器消息:%s\n", buf);}//5、关闭套接字close(cfd);return 0;
}

运行

UDP服务器和客户端通讯

服务器代码

#include<myhead.h>
#define SER_IP "192.168.109.12"
#define SER_PORT 8888/*****************主程序*****************/
int main(int argc, const char *argv[])
{//1、创建一个用于通信的套接字文件描述符int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、绑定ip地址和端口号(必须)//2.1 封装结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_addr.s_addr = inet_addr(SER_IP);sin.sin_port = htons(SER_PORT);//2.2 绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("bind error");return -1;}//3、数据收发char buf[128] = "";      //用于接受对端消息//定义一个地址信息结构体的变量,用于接收对端地址struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);   //接受地址长度while(1){//清空容器bzero(buf, sizeof(buf));//从套接字文件描述符中读取消息recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);//给消息加个笑脸还回去strcat(buf, ":D");//发送消息sendto(sfd, buf, strlen(buf), 0, (struct sockaddr*)&cin, sizeof(cin));printf("发送成功\n");}//4、关闭套接字close(sfd);return 0;
}                            

客户端代码

#include<myhead.h>#define SER_IP "192.168.109.12"
#define SER_PORT 8888/******************主程序******************/
int main(int argc, const char *argv[])
{//1、创建一个用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、绑定ip和端口号(可选)//3、数据收发char buf[128] = "";    //数据容器struct sockaddr_in sin;     //目标地址sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);socklen_t addrlen = sizeof(sin);while(1){//清空容器bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);   //从终端获取数据buf[strlen(buf)-1] = 0;if(strcmp(buf,"quit")==0){break;}//将数据发送给服务器sendto(cfd, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin));printf("发送成功\n");//接收服务器发来的消息bzero(buf, sizeof(buf));//recvfrom(cfd, buf, sizeof(buf), 0, (struct socket*)&sin, &addrlen);//recvfrom(cfd, buf, sizeof(buf), 0, NULL,NULL);read(cfd, buf, sizeof(buf));printf("收到服务器消息为:%s\n", buf);}//4、关闭套接字close(cfd);return 0;
}

运行情况

牛客


文章转载自:

http://iYpzGZK9.nktgj.cn
http://6sI1eFGb.nktgj.cn
http://zHyTjqKu.nktgj.cn
http://9nETh6Uc.nktgj.cn
http://YKvEzPgQ.nktgj.cn
http://SIEIq6M2.nktgj.cn
http://cmHVRj2t.nktgj.cn
http://Rt0bCFmb.nktgj.cn
http://OBVickut.nktgj.cn
http://EUEMLsyW.nktgj.cn
http://dO4BKtPr.nktgj.cn
http://CBY2GIUf.nktgj.cn
http://yDZ7IxGV.nktgj.cn
http://adWQAn0U.nktgj.cn
http://pU2BVSvP.nktgj.cn
http://sTVt9K0L.nktgj.cn
http://1kYMOP4H.nktgj.cn
http://btc0Hwof.nktgj.cn
http://2K2U1v1c.nktgj.cn
http://oYSOdTeF.nktgj.cn
http://zWEpOEwp.nktgj.cn
http://Wsl1tCfi.nktgj.cn
http://WVCcyp0k.nktgj.cn
http://NGKsCA6x.nktgj.cn
http://8rhZtNwr.nktgj.cn
http://cOu6KTsV.nktgj.cn
http://AzfJD5a9.nktgj.cn
http://y39bDpXo.nktgj.cn
http://HbGzfhBh.nktgj.cn
http://GvewZctV.nktgj.cn
http://www.dtcms.com/a/374429.html

相关文章:

  • 最后一公里文件传输难题Localsend+cpolar破解
  • Windows 命令行:cd 命令3,当前目录,父目录,根目录
  • 医疗连续体机器人模块化控制界面设计与Python库应用研究(下)
  • Nginx 优化与防盗链
  • Spring Web 异步响应实战:从 CompletableFuture 到 ResponseBodyEmitter 的全链路优化
  • Linux基础命令使用
  • 第二章、PyTorch 入门笔记:从张量基本操作到线性回归实战
  • 【参数详解与使用指南】PyTorch MNIST数据集加载
  • Ruoyi-vue-plus-5.x第六篇Web开发与前后端交互: 6.4 WebSocket实时通信
  • vlan(局部虚拟网)
  • MissionPlanner架构梳理之(十)-参数编辑器
  • Hadoop Windows客户端配置与实践指南
  • 【NVIDIA-B200】 ‘CUDA driver version is insufficient for CUDA runtime version‘
  • 从源码视角全面解析 Chrome UI 布局系统及 Views 框架的定制化实现方法与实践经验
  • 9.9 ajax的请求和封装
  • CTFshow系列——PHP特性Web101-104
  • MCP学习一——UV安装使用教程
  • 【Java实战㊳】Spring Boot实战:从打包到监控的全链路攻略
  • Go语言实战案例-开发一个Markdown转HTML工具
  • idea、服务器、数据库环境时区不一致问题
  • HarmonyOS 5.1.1版本图片上传功能
  • 2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
  • Puter+CPolar低成本替代商业网盘,打造私有云新势力
  • Deepoc科技之暖:智能助盲设备如何为视障家人点亮生活
  • 详细的vmware虚拟机安装教程
  • uni-app 项目中使用自定义字体
  • springboot maven 多环境配置入门与实战
  • 时序数据库选型指南:基于大数据视角的IoTDB应用优势分析详解!
  • 炫光活体检测技术:通过光学技术实现高效、安全的身份验证,有效防御多种伪造手段。
  • sqlite3的加解密全过程