UDP server Code
时间:2018-09-20
本文章向大家介绍UDP server Code,需要的朋友可以参考一下
Code Example:
The following programs demonstrate the use of getaddrinfo(), gai_strerror(), freeaddrinfo(), and getnameinfo(). The programs are an echo server and client for UDP datagrams.
服务器端程序:
1 ###Server program 2 3 #include <sys/types.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <unistd.h> 7 #include <string.h> 8 #include <sys/socket.h> 9 #include <netdb.h> 10 11 #define BUF_SIZE 500 12 13 int 14 main(int argc, char *argv[]) 15 { 16 struct addrinfo hints; 17 struct addrinfo *result, *rp; 18 int sfd, s; 19 struct sockaddr_storage peer_addr; 20 socklen_t peer_addr_len; 21 ssize_t nread; 22 char buf[BUF_SIZE]; 23 24 if (argc != 2) { 25 fprintf(stderr, "Usage: %s portn", argv[0]); 26 exit(EXIT_FAILURE); 27 } 28 29 memset(&hints, 0, sizeof(struct addrinfo)); 30 hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ 31 hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ 32 hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */ 33 hints.ai_protocol = 0; /* Any protocol */ 34 hints.ai_canonname = NULL; 35 hints.ai_addr = NULL; 36 hints.ai_next = NULL; 37 38 s = getaddrinfo(NULL, argv[1], &hints, &result); 39 if (s != 0) { 40 fprintf(stderr, "getaddrinfo: %sn", gai_strerror(s)); 41 exit(EXIT_FAILURE); 42 } 43 44 /* getaddrinfo() returns a list of address structures. 45 Try each address until we successfully bind(2). 46 If socket(2) (or bind(2)) fails, we (close the socket 47 and) try the next address. */ 48 49 for (rp = result; rp != NULL; rp = rp->ai_next) { 50 sfd = socket(rp->ai_family, rp->ai_socktype, 51 rp->ai_protocol); 52 if (sfd == -1) 53 continue; 54 55 if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0) 56 break; /* Success */ 57 58 close(sfd); 59 } 60 61 if (rp == NULL) { /* No address succeeded */ 62 fprintf(stderr, "Could not bindn"); 63 exit(EXIT_FAILURE); 64 } 65 66 freeaddrinfo(result); /* No longer needed */ 67 68 /* Read datagrams and echo them back to sender */ 69 70 for (;;) { 71 peer_addr_len = sizeof(struct sockaddr_storage); 72 nread = recvfrom(sfd, buf, BUF_SIZE, 0, 73 (struct sockaddr *) &peer_addr, &peer_addr_len); 74 if (nread == -1) 75 continue; /* Ignore failed request */ 76 77 char host[NI_MAXHOST], service[NI_MAXSERV]; 78 79 s = getnameinfo((struct sockaddr *) &peer_addr, 80 peer_addr_len, host, NI_MAXHOST, 81 service, NI_MAXSERV, NI_NUMERICSERV); 82 if (s == 0) 83 printf("Received %zd bytes from %s:%sn", 84 nread, host, service); 85 else 86 fprintf(stderr, "getnameinfo: %sn", gai_strerror(s)); 87 88 if (sendto(sfd, buf, nread, 0, 89 (struct sockaddr *) &peer_addr, 90 peer_addr_len) != nread) 91 fprintf(stderr, "Error sending responsen"); 92 } 93 }
客户端程序:
1 ###Client program 2 3 #include <sys/types.h> 4 #include <sys/socket.h> 5 #include <netdb.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <unistd.h> 9 #include <string.h> 10 11 #define BUF_SIZE 500 12 13 int 14 main(int argc, char *argv[]) 15 { 16 struct addrinfo hints; 17 struct addrinfo *result, *rp; 18 int sfd, s, j; 19 size_t len; 20 ssize_t nread; 21 char buf[BUF_SIZE]; 22 23 if (argc < 3) { 24 fprintf(stderr, "Usage: %s host port msg...n", argv[0]); 25 exit(EXIT_FAILURE); 26 } 27 28 /* Obtain address(es) matching host/port */ 29 30 memset(&hints, 0, sizeof(struct addrinfo)); 31 hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ 32 hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ 33 hints.ai_flags = 0; 34 hints.ai_protocol = 0; /* Any protocol */ 35 36 s = getaddrinfo(argv[1], argv[2], &hints, &result); 37 if (s != 0) { 38 fprintf(stderr, "getaddrinfo: %sn", gai_strerror(s)); 39 exit(EXIT_FAILURE); 40 } 41 42 /* getaddrinfo() returns a list of address structures. 43 Try each address until we successfully connect(2). 44 If socket(2) (or connect(2)) fails, we (close the socket 45 and) try the next address. */ 46 47 for (rp = result; rp != NULL; rp = rp->ai_next) { 48 sfd = socket(rp->ai_family, rp->ai_socktype, 49 rp->ai_protocol); 50 if (sfd == -1) 51 continue; 52 53 if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) 54 break; /* Success */ 55 56 close(sfd); 57 } 58 59 if (rp == NULL) { /* No address succeeded */ 60 fprintf(stderr, "Could not connectn"); 61 exit(EXIT_FAILURE); 62 } 63 64 freeaddrinfo(result); /* No longer needed */ 65 66 /* Send remaining command-line arguments as separate 67 datagrams, and read responses from server */ 68 69 for (j = 3; j < argc; j++) { 70 len = strlen(argv[j]) + 1; 71 /* +1 for terminating null byte */ 72 73 if (len + 1 > BUF_SIZE) { 74 fprintf(stderr, 75 "Ignoring long message in argument %dn", j); 76 continue; 77 } 78 79 if (write(sfd, argv[j], len) != len) { 80 fprintf(stderr, "partial/failed writen"); 81 exit(EXIT_FAILURE); 82 } 83 84 nread = read(sfd, buf, BUF_SIZE); 85 if (nread == -1) { 86 perror("read"); 87 exit(EXIT_FAILURE); 88 } 89 90 printf("Received %zd bytes: %sn", nread, buf); 91 } 92 93 exit(EXIT_SUCCESS); 94 }
- 关于PHP浮点数精度损失问题
- FreeMarker与JSP 2.0 + JSTL组合进行比较
- 从零开始学设计模式(1):基础编程模式
- 机器学习实战 | 第四章:模型验证和选择
- ofbiz中FreeMarkerWorker的makeConfiguration方法
- 后台进程(守护进程)自动备份PostgreSQL数据库
- 了解这些PHP小技巧吗?
- 结构体字节对齐
- 在Atom中设置Python开发环境
- Assignment 3 (神经网络) | 斯坦福CS231n-深度学习与计算机视觉课程
- ofbiz view渲染处理机制
- ofbiz方法一 条件查询createConditionList
- ofbiz的ant命令创建模块
- 几个不常用但特别实用的PHP预定义变量
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [Maven][taglist-maven-plugin]告警[WARNING] Using legacy tag format
- [Maven][l10n-maven-plugin]告警[WARNING] No dictionary file under folder
- Python基础之多文件项目的演练
- Python中的命名空间和作用域(1)
- 浅谈Mybatis持久化框架在Spring、SSM、SpringBoot整合的演进及简化过程
- 玩转注册表,这几个windowsAPI函数就够了
- 施工专题第11篇:Python 包和模块使用总结
- Node.js-具有示例API的基于角色的授权教程
- 删库时,我后悔没早学会的数据库知识
- SwiftUI:使自定义类型符合 Comparable 协议
- 【CCF】线性分类器
- 计数二进制子串
- 6个实例详解如何把if-else代码重构成高质量代码
- leetcode201场周赛
- ASP.NET MVC+LayUI视频上传