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

C/S架构学习之UDP服务器

  • UDP服务器的实现流程:
  • 一、创建用户数据报套接字(socket函数):
  • 通信域选择IPV4网络协议、套接字类型选择数据报式
	int sockfd = socket(AF_INET,SOCK_DGRAM,0); 
  • 二、填充服务器的网络信息结构体:
  • 1.定义网络信息结构体变量;
  • 2.求出结构体变量的内存空间大小;
  • 3.结构体清零;
  • 4.使用IPV4网络协议;
  • 5.预留给在终端输入的网络字节序的端口号;
  • 6.预留给在终端输入的IP地址;
	struct sockaddr_in serveraddr; //定义网络信息结构体变量socklen_t serveraddrlen = sizeof(serveraddr);//求出结构体变量的内存空间大小memset(&serveraddr,0,serveraddrlen); //结构体清零serveraddr.sin_family = AF_INET;  //使用IPV4网络协议serveraddr.sin_addr.s_addr = inet_addr(argv[1]); //网络字节序的端口号serveraddr.sin_port = htons(atoi(argv[2])); //IP地址
  • 三、套接字和服务器的网络信息结构体进行绑定(bind函数):
	int ret = bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen);
  • 四、接收来自客户端的数据(recvfrom函数)和给客户端发送应答消息(sendto函数):
	int ret1 = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,&clientaddrlen);strcat(buf,"------------k");int ret2 =sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,clientaddrlen);
  • 五、关闭套接字(close函数):
	close(sockfd);
  • 综合应用实例代码如下所示:
//UDP服务器#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERRLOG(msg) do{\printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\perror(msg);\exit(-1);\}while(0)int main(int argc, const char *argv[])
{//入参合理性检查if(3 != argc){printf("Usage : %s <IP> <port>\n", argv[0]);exit(-1);}//创建用户数据报套接字int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){ERRLOG("socket error");}//填充服务器网络信息结构体struct sockaddr_in serveraddr;socklen_t serveraddrlen = sizeof(serveraddr);memset(&serveraddr,0,serveraddrlen);serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);serveraddr.sin_port = htons(atoi(argv[2]));//将套接字与服务器网络信息结构体绑定if(-1 == bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen)){ERRLOG("bind error");}//定义新的结构体,保存来自客户端信息struct sockaddr_in clientaddr;socklen_t clientaddrlen = sizeof(clientaddr);memset(&clientaddr,0,clientaddrlen);//收发数据char buf[128] = {0};while(1){memset(buf,0,sizeof(buf));if(-1 == recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,&clientaddrlen)){ERRLOG("recvfrom error");}printf("客户端[%s:%d]发来数据[%s]\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),buf);//组装应答消息strcat(buf,"------------k");if(-1 == sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,clientaddrlen)){ERRLOG("sendto error");}}//关闭套接字close(sockfd);return 0;
}
  • 本示例代码,仅供参考;
http://www.lryc.cn/news/175699.html

相关文章:

  • 磁盘占用率100% 的优化方案
  • vue组件的通信
  • (搞定)排序数据结构(1)插入排序 选择排序+冒泡排序
  • C++ 类访问修饰符 public、private、protected
  • pytorch学习笔记——BCE与CE
  • win使用git(保姆级教程)
  • Python图像处理-----几何变换
  • 如何正确选择研究方向?如何实现论文创新?
  • Postgresql源码(113)表达式JIT计算简单分析
  • CMU15-213 课程笔记 04-Floating Point
  • DockerKubernetes ❀ Service下Port端口区分
  • 【C++】笔试训练(一)
  • 数据结构与算法之集合: Leetcode 349. 两个数组的交集 (Typescript版)
  • Unity 内存性能分析器 (Memory Profiler)
  • 前端携带Bearer Token
  • leetcode 周赛 364
  • 开机自启动Linux and windows
  • 科技云报道:大模型的阴面:无法忽视的安全隐忧
  • 2023年前端流行什么技术和框架了?
  • Nginx 背锅解析漏洞
  • AI与传统数据库 - ChatGPT风过之后 | 从Duet AI说开来
  • L1-032 Left-pad C++解法
  • Python 用列表实现模拟手机通讯录(简易版)
  • macOS使用官方安装包安装python
  • 如何重装Windows Mirosoft Store
  • 软考高级系统架构设计师系列论文真题七:基于构件的软件开发
  • git rebase 修改中间的commit
  • 登录业务实现 - token登录鉴权
  • 内存对齐--面试常问问题和笔试常考问题
  • 贪心算法-会议室问题