用udp协议传输文件
目录
头文件/宏定义
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <time.h>
- #include <pthread.h>
- #include <netinet/tcp.h>
- #include <unistd.h>
- #include <strings.h>
- #include <errno.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- // 缓存区大小
- #define BUFFER 512
复制代码 客户端
- /********************************************************************
- *
- * name : main 客户端
- * function : 使用udp网络协议从服务器发送音频文件到客户端
- * argument :
- * @n :arg
- *
- * retval : none
- * author : 17647576169@163.com
- * date : 2024年6月4日
- * note :
- *
- * *****************************************************************/
- int main(int argc, char const *argv[])
- {
- // 1.创建UDP套接字
- int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
- if (udp_socket == -1)
- {
- fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
- exit(1);
- }
- // 2.需要先绑定主机的端口和地址
- struct sockaddr_in host_addr;
- host_addr.sin_family = AF_INET; // 协议族,是固定的
- host_addr.sin_port = htons(atoi(argv[1])); // 目标端口,必须转换为网络字节序
- host_addr.sin_addr.s_addr = inet_addr(argv[2]); // 目标地址 "192.168.64.xxx" 已经转换为网络字节序
- bind(udp_socket, (struct sockaddr *)&host_addr, sizeof(host_addr)); // 绑定
- // 3.创建接收文件
- int fd_mp3 = open("./my.mp3", "wb");
- if (fd_mp3 == -1)
- {
- fprintf(stderr, "open my.mp3 error,errno:%d,%s\n", errno, strerror(errno));
- exit(1);
- }
- // 设置缓存区
- char buf[BUFFER] = {0};
- // 3.循环发送数据
- while (1)
- {
- recvfrom(udp_socket, buf, sizeof(buf), 0, NULL, NULL);
- int write_fb= write(fd_mp3, &buf, BUFFER);
- if (write_fb == -1)
- {
- fprintf(stderr, "read demo.mp3 error,errno:%d,%s\n", errno, strerror(errno));
- exit(1);
- }
- bzero(buf, sizeof(buf));
- }
- return 0;
- }
复制代码 服务器
- /********************************************************************
- *
- * name : main 服务器
- * function : 使用udp网络协议从服务器发送音频文件到客户端
- * argument :
- * @n :argc
- * @n :argv
- * retval : none
- * author : 17647576169@163.com
- * date : 2024年6月4日
- * note :
- *
- * *****************************************************************/
- int main(int argc, char const *argv[])
- {
- // 1.创建UDP套接字
- int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
- if (udp_socket == -1)
- {
- fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
- exit(1);
- }
- // 2.需要先绑定主机的端口和地址
- struct sockaddr_in host_addr;
- host_addr.sin_family = AF_INET; // 协议族,是固定的
- host_addr.sin_port = htons(atoi(argv[1])); // 目标端口,必须转换为网络字节序
- host_addr.sin_addr.s_addr = inet_addr(argv[2]); // 目标地址 "192.168.64.xxx" 已经转换为网络字节序
- bind(udp_socket, (struct sockaddr *)&host_addr, sizeof(host_addr)); // 绑定
- // 3.发送打开音频文件
- int fd_mp3 = open("./demo.mp3", "rb");
- if (fd_mp3 == -1)
- {
- fprintf(stderr, "open demo.mp3 error,errno:%d,%s\n", errno, strerror(errno));
- exit(1);
- }
- // 计算发送次数
- char buf[BUFFER] = {0};
- struct stat stat_buf;
- statstat("./demo.mp3", &stat_buf);
- int cnt = stat_buf.st_size / BUFFER;
- if (stat_buf.st_size % BUFFER)
- {
- cnt++;
- }
- // 3.循环发送数据
- while (1)
- {
- for (int i = 0; i < cnt; i++)
- {
- int read_fb = read(fd_mp3, &buf, BUFFER);
- if (read_fb == -1)
- {
- fprintf(stderr, "read demo.mp3 error,errno:%d,%s\n", errno, strerror(errno));
- exit(1);
- }
- sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&host_addr, sizeof(host_addr));
- bzero(buf, sizeof(buf));
- }
- }
- return 0;
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |