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

l8-d9 UDP通信实现

一、函数接口扩展与UDP通信实现流程

1.write/read到send/recv

函数原型:

        ssize_t send(int sockfd, const void *buf, size_t len, int flags);

        ssize_t recv(int sockfd, void *buf, size_t len, int flags);

前三个参数同read/write一样;

         ssize_t read(int fd, void *buf, size_t count);

        ssize_t write(int fd, const void *buf, size_t count);

常见flags:

        1. 一般设置为0

        2. MSG_PEEK:窥视传入的数据。数据被复制到缓冲区中,但不会从输入队列中删除。

         3. MSG_OOB:处理带外(OOB)数据

2.sendto与recvfrom

函数原型:

        ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

        ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

1. 前四个参数同recv/send一样;

2. 后两个参数是通信结构体和结构体的宽度; 

3.UDP通信的实现过程

二、UDP服务器代码 

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, char *argv[])
{int fd;struct sockaddr_in addr;char buf[BUFSIZ] = {};if(argc < 3){fprintf(stderr, "%s<addr><port>\n", argv[0]);exit(EXIT_FAILURE);}/*创建套接字*/if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0){perror("socket");exit(EXIT_FAILURE);}/*设置通信结构体*/bzero(&addr, sizeof(addr) );addr.sin_port = htons( atoi(argv[2]) );if(inet_aton(argv[1], &addr.sin_addr) == 0) {fprintf(stderr, "Invalid address\n");exit(EXIT_FAILURE);}/*绑定通信结构体*/if(bind(fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1){perror("bind");exit(EXIT_FAILURE);}while(1){bzero(buf, BUFSIZ);recvfrom(fd, buf, BUFSIZ, 0, NULL, NULL);printf("buf=%s\n", buf);}close(fd);return 0;
}

三、客户端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{int fd;struct sockaddr_in addr;char buf[BUFSIZ] = {};socklen_t addrlen = sizeof(addr);if(argc < 3){fprintf(stderr, "%s<addr><port>\n", argv[0]);exit(EXIT_FAILURE);}/*创建套接字*/if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0){perror("socket");exit(EXIT_FAILURE);}/*设置通信结构体*/bzero(&addr, sizeof(addr) );addr.sin_port = htons( atoi(argv[2]) );if(inet_aton(argv[1], &addr.sin_addr) == 0) {fprintf(stderr, "Invalid address\n");exit(EXIT_FAILURE);}while(1){bzero(buf, BUFSIZ);printf("Input->");fgets(buf, BUFSIZ, stdin);sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&addr, addrlen);}close(fd);return 0;
}

Makefile

CC=gcc
CFLAGS=-Wall
all:server client

clean:
    rm server client
 

http://www.lryc.cn/news/160328.html

相关文章:

  • MongoDB复杂聚合查询与java中MongoTemplate的api对应
  • WireShark抓包工具的安装
  • 审计智能合约的成本是多少?如何审计智能合约?
  • 9.7 校招 内推 面经
  • 【网络编程】IO多路复用
  • MySQL与postgreSQL数据库的区别
  • 单片机电子元器件-按键
  • Nacos docker实现nacos高可用集群项目
  • 基于Dubbo实现服务的远程调用
  • Redis事务的理解
  • PostgreSQL安装异常,服务无法启动导致创建服务器超时
  • 汽车电子系统网络安全解决方案
  • 切片机制和MR工作机制
  • 【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路
  • 是的,决定放弃算法去机器学习了
  • Python 03(循环语句)
  • 安科瑞铁塔基站能耗监控解决方案
  • 操作系统-线程复用
  • 通达信自定义副图行业指标K线指标 HYZS_QD
  • MDK-Keil AC6 Compiler屏蔽特定警告
  • 计算机网络的故事——了解Web及网络基础
  • [系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解
  • 自动驾驶——估计预瞄轨迹YawRate
  • PMP证书考下来要多少费用?
  • C动态分配
  • C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)
  • Docker部署EMQX
  • Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon
  • 好玩的js特效
  • java实现带有html格式和附件的符合RFC822规范的eml格式的信件原文组装