UDP通信

embedded/2024/11/25 19:54:29/

文章目录

  • recvfrom和sendto函数
  • UDP通信server和client流程
  • UDP实现的并发服务器和客户端


recvfrom和sendto函数

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);sockfd: 套接字buf:缓冲区地址len:缓冲区大小flags: 0src_addr:(struct sockaddr *&addr 传出。 对端地址结构addrlen:传入传出。返回值: 成功接收数据字节数。 失败:-1 errn。 0: 对端关闭。ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);sockfd: 套接字buf:存储数据的缓冲区len:数据长度flags: 0src_addr:(struct sockaddr *&addr 传入。 目标地址结构addrlen:地址结构长度。返回值:成功写出数据字节数。 失败 -1, errno		

UDP通信server和client流程

UDP实现的 C/S 模型:recv()/send() 只能用于 TCP 通信。 替代 read、writeaccpet(); ---- connect(); ---被舍弃server:socket(AF_INET, SOCK_DGRAM, 0);	SOCK_DGRAM --- 报式协议。bind();listen();  --- 可有可无while1{recvfrom() --- 涵盖accept传出地址结构。小-- 大sendto()}close();client:socket(AF_INET, SOCK_DGRAM, 0);sendto()recvfrom()写到屏幕close();

在这里插入图片描述

UDP实现的并发服务器和客户端

server.c

#include <string.h>  
#include <stdio.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <ctype.h>  #define SERV_PORT 8000  int main(void)  
{  struct sockaddr_in serv_addr, clie_addr;  socklen_t clie_addr_len;  int sockfd;  char buf[BUFSIZ];  char str[INET_ADDRSTRLEN];  int i, n;  sockfd = socket(AF_INET, SOCK_DGRAM, 0);  bzero(&serv_addr, sizeof(serv_addr));  serv_addr.sin_family = AF_INET;  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);  serv_addr.sin_port = htons(SERV_PORT);  bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));  printf("Accepting connections ...\n");  while (1) {  clie_addr_len = sizeof(clie_addr);  n = recvfrom(sockfd, buf, BUFSIZ,0, (struct sockaddr *)&clie_addr, &clie_addr_len);  if (n == -1)  perror("recvfrom error");  printf("received from %s at PORT %d\n",  inet_ntop(AF_INET, &clie_addr.sin_addr, str, sizeof(str)),  ntohs(clie_addr.sin_port));  for (i = 0; i < n; i++)  buf[i] = toupper(buf[i]);  n = sendto(sockfd, buf, n, 0, (struct sockaddr *)&clie_addr, sizeof(clie_addr));  if (n == -1)  perror("sendto error");  }  close(sockfd);  return 0;  
}  

client.c

#include <stdio.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <ctype.h>  #define SERV_PORT 8000  int main(int argc, char *argv[])  
{  struct sockaddr_in servaddr;  int sockfd, n;  char buf[BUFSIZ];  sockfd = socket(AF_INET, SOCK_DGRAM, 0);  bzero(&servaddr, sizeof(servaddr));  servaddr.sin_family = AF_INET;  inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);  servaddr.sin_port = htons(SERV_PORT);  while (fgets(buf, BUFSIZ, stdin) != NULL) {  n = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));  if (n == -1)  perror("sendto error");  n = recvfrom(sockfd, buf, BUFSIZ, 0, NULL, 0);         //NULL:不关心对端信息  if (n == -1)  perror("recvfrom error");  write(STDOUT_FILENO, buf, n);  }  close(sockfd);  return 0;  
}  

http://www.ppmy.cn/embedded/34124.html

相关文章

PC端Discord设置代理2022

开始使用 方法非常简单&#xff0c;在此下载release.zip并解压version.dll https://github.com/aiqinxuancai/discord-proxy/releases​github.com/aiqinxuancai/discord-proxy/releases 将version.dll放在Discord.exe所在目录&#xff08;如Discord有更新&#xff0c;则可能…

自适应调节Q和R的自适应UKF(AUKF_QR)的MATLAB程序

简述 基于三维模型的UKF&#xff0c;设计一段时间的输入状态误差较大&#xff0c;此时通过对比预测的状态值与观测值的残差&#xff0c;在相应的情况下自适应调节系统协方差Q和观测协方差R&#xff0c;构成自适应无迹卡尔曼滤波&#xff08;AUKF&#xff09;&#xff0c;与传统…

Eclipse中开启服务,网页无法打开 运行程序显示404

一、eclipse中开启服务后&#xff0c;网页无法打开的问题 当你在eclipse中开启服务后&#xff0c;如果网页无法打开&#xff0c;可能是以下几个原因导致的&#xff1a; 1. 端口冲突&#xff1a;请确保你所使用的端口没有被其他程序占用。可以尝试更换一个未被占用的端口。 2…

Unity 性能优化之动态批处理(四)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、动态合批是什么&#xff1f;二、使用动态批处理1.打开动态合批2.满足条件 三、检查动态合批是否成功五、动态合批弊端总结 前言 动态批处理是常用优…

【AI】指定python3.10安装Jupyter Lab

家里电脑 13900K, bash 不识别pythoncmd可以,但是cmd似乎默认是python2.7这个是webrtc构建需要的.python3 则可以识别到但是版本是python3.12*多个版本如何通过制定的python3.10 的pip来安装软件,例如Jupyter Lab安装3.10 C:\Users\zhangbin\AppData\Roaming\Microsoft\Windo…

毕设:邮件分发系统

文章目录 前言一、登录1.邮箱登录2.账号登录 二、注册三、首页四、写邮件五、收邮件六、草稿箱七、垃圾箱八、已发送九、通讯录十、用户管理十一、邮件管理十二、登录日志总结 前言 分享一下邮件分发系统 一、登录 1.邮箱登录 2.账号登录 二、注册 三、首页 首页有邮件信息&…

【centos】vmware安装airflow流程

文章目录 1.下载系统https://mirrors.aliyun.com/centos/7/isos/x86_64/ 选择DVD20092.在VMware中&#xff0c;除了修改安装位置&#xff0c;其它选择默认安装centos73.用户名为root,登录4.网络适配器为桥接模式。5.使用命令消除显示器警告。6.安装anaconda6.1下载包&#xff1…

Vue基础 - axios

目录 1.axios请求实例 1、vue前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conte…