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

网络编程day2

基于UDP的通信方式

服务器端

include<myhead.h>
//宏定义ip地址和端口号
#define SER_IP "192.168.109.125"
#define SER_PORT 8888                  //服务器端口号int main(int argc, const char *argv[])
{//1、创建服务器套接字文件描述符:用于通信int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(-1 == sfd){perror("socket error");return -1;}printf("socket success  sfd = %d\n", sfd);   //3//设置套接字属性:允许端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、绑定ip地址和端口号//2.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);   //配置ip地址//2.2 绑定操作if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind  error");return -1;}printf("bind  success\n");//3、数据收发//定义地址信息结构体变量,以便于接收对端地址信息结构体struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);     //接收地址信息的大小while(1){char rbuf[128] = "";         //定义接收消息的容器//接收客户端消息recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cin, &addrlen);printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);//给消息加个笑脸还回去strcat(rbuf, "*_*");//向客户端发送消息sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cin, sizeof(cin));printf("发送成功\n");}//4、关闭服务器close(sfd);return 0;
}

客户端

include<myhead.h>#define SER_IP "192.168.109.125"       //服务器ip地址
#define SER_PORT 8888                  //服务器端口号
#define CLI_IP  "192.168.109.125"      //客户端ip地址
#define CLI_PORT 9999                  //客户端端口号int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(-1 == cfd){perror("socket error");return -1;}printf("socket success  cfd = %d\n", cfd);           //3//2、绑定ip地址和端口号(可选)//2.1 填充客户端地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;                //通信域cin.sin_port = htons(CLI_PORT);          //客户端端口号cin.sin_addr.s_addr = inet_addr(CLI_IP);  //客户端ip地址//2.2 进行绑定工作if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind  success\n");//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);  //服务器ip地址socklen_t addrlen = sizeof(sin);          //地址信息结构体的大小while(1){char wbuf[128] = "";//从终端获取一个字符串fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//将消息发送给服务器sendto(cfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&sin, addrlen);printf("发送成功\n");//接收服务器回复的消息recv(cfd, wbuf, sizeof(wbuf), 0);printf("收到消息为:%s\n", wbuf);}//4、关闭客户端close(cfd);return 0;
}

http://www.xdnf.cn/news/18128.html

相关文章:

  • Windows 8.1 补丁 KB2919355 安装方法 详细步骤
  • 管理本地用户和组:红帽企业 Linux 系统安全的基础
  • Python数据容器(列表,元组,字典) 从入门到精通
  • ​Kali Linux 环境中的系统配置文件与用户配置文件大全
  • 无人机基础知识
  • 力扣70:爬楼梯
  • Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
  • 功能测试相关问题
  • CNN-BiLSTM-Attention、CNN-BiLSTM、BiLSTM三模型多变量时序光伏功率预测
  • Maven 生命周期和插件
  • shell脚本第一阶段
  • 自学中医笔记(二)
  • Mysql——分库分表后id冲突解决方案(即分布式ID的生成方案)
  • 【tips】unsafe-eval线上页面突然空白
  • python实现pdfs合并
  • Ansible 部署LNMP
  • Read View 在 MVCC 里如何工作的?
  • 下载大模型经常遇到的报错Still waiting to acquire lock on Wan2.1-VACE-14B/.cache与解决办法
  • Linux系统WireShark抓取本地网卡报文
  • 发布npmjs组件库
  • 套接字超时控制与服务器调度策略
  • 多台服务器批量发布arcgisserver服务并缓存切片
  • 开发指南133-设定列表分页的初始默认每页行数
  • vue从入门到精通:搭建第一个vue项目
  • 【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks
  • Rust学习笔记(六)|Rust 中的常用集合(Vector、String、HashMap)
  • Rust 异步中的 Waker
  • Linux权限的学习
  • 概率论基础教程第4章 随机变量(三)
  • 【opencv-Python学习笔记(7):图像平滑处理】