网络编程学习笔记(udp_server函数)
来源:互联网 发布:java基础知识体系结构 编辑:程序博客网 时间:2024/05/29 17:31
创建一个UDP口的服务端,其代码如下:
#include <netdb.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAXLINE 128int udp_server(const char *host, const char *serv, socklen_t *addrlenp){int sockfd, n;struct addrinfo hints, *res, *ressave;bzero(&hints, sizeof(hints));hints.ai_flags = AI_PASSIVE;hints.ai_family = AF_UNSPEC;hints.ai_socktype = SOCK_DGRAM;if ((n = getaddrinfo(host, serv, &hints, &res)) != 0) {printf("udp_server error for %s,%s:%s\n", host, serv, gai_strerror(n));return -1;}ressave = res;do {sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);if (sockfd < 0) continue;if (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0) break;close(sockfd);} while ((res = res->ai_next) != NULL);if (res == NULL) {printf("udp_server error for %s,%s\n", host, serv);return -1;}freeaddrinfo(ressave);if (addrlenp) *addrlenp = res->ai_addrlen;return sockfd;}char *sock_ntop(const struct sockaddr* sa, socklen_t len){char portstr[7];static char str[MAXLINE + 1];switch (sa->sa_family) {case AF_INET:{struct sockaddr_in *sin = (struct sockaddr_in*)sa;if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL) return NULL;if (ntohs(sin->sin_port) != 0) {snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));strcat(str, portstr);}return str;}}return NULL;}int main(int argc, char **argv){int sockfd;ssize_t n;char buff[MAXLINE];time_t ticks;socklen_t addrlen, len;struct sockaddr *cliaddr;if (argc == 2) sockfd = udp_server(NULL, argv[1], &addrlen);else if (argc == 3) sockfd = udp_server(argv[1], argv[2], &addrlen);else {printf("usage:exename [<host>] <service or port>\n");return -1;}cliaddr = malloc(addrlen);for (;;) {len = addrlen;n = recvfrom(sockfd, buff, MAXLINE, 0, cliaddr, &len);printf("datagram form %s\n", sock_ntop(cliaddr, len));ticks = time(NULL);snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));sendto(sockfd, buff, strlen(buff), 0, cliaddr, len);}}
输出为:
0 0
- 网络编程学习笔记(udp_server函数)
- 【网络】udp_server
- 网络编程学习笔记(poll函数)
- 网络编程学习笔记(gethostbyname函数)
- 网络编程学习笔记(gethostbyaddr函数)
- 网络编程学习笔记(uname函数)
- 网络编程学习笔记(gethostname函数)
- 网络编程学习笔记(getaddrinfo函数)
- 网络编程学习笔记(gai_strerror函数)
- 网络编程学习笔记(freeaddrinfo函数)
- 网络编程学习笔记(tcp_connect函数)
- 网络编程学习笔记(tcp_listen函数)
- 网络编程学习笔记(udp_client函数)
- 网络编程学习笔记(udp_connect函数)
- 网络编程学习笔记(getnameinfo函数)
- 网络编程学习笔记(socketpair函数)
- 网络编程学习笔记(shutdown函数)
- udp_server
- mysql同步字符集故障处理
- 文件上传三剑客(二)-后台数据库存储
- 开灯问题
- 被占用的COM释放
- IIS Microsoft Office Excel 不能访问文件
- 网络编程学习笔记(udp_server函数)
- 【无向图的双连通分量】
- AWK
- 【黑马程序员】单例设计模式与装饰设计模(十二)
- Java NIO系列教程(二) Channel
- 字符串指针与字符数组
- AWK
- Java NIO系列教程(三) Buffer
- python正则表达式学习笔记01