网络编程学习笔记(udp_server函数)
2014-10-12 15:40
351 查看
创建一个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 128 int 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); } }
输出为:
相关文章推荐
- UDP local server--Python网络编程学习笔记
- WinSock网络编程学习笔记(六):服务查询程序(getserverbyname和getserverbyport函数)
- 网络编程学习笔记(udp_client函数)
- java 从零开始,学习笔记之基础入门<SQL_Server_视图_函数_存储过程_触发器等>(二十三)
- WinSock网络编程学习笔记(九):基于UDP实现DayTime协议
- 黑马程序员_学习笔记第23天——网络编程TCP/UDP
- 网络编程(UDP/TCP)+JAVA学习笔记-DAY26
- 黑马程序员________Java中UDP和TCP网络编程学习笔记
- 黑马程序员_学习笔记第22天——网络编程TCP/UDP
- ArcGIS API For Flex对ImageServer发布的服务进行渲染及RasterFunction支持函数(学习笔记)
- python网络编程学习笔记(2)--TCP和UDP区别(补充)
- 网络编程学习笔记(poll函数)
- java6.02学习笔记UDPserver
- Java 网络编程学习笔记 (五) UDP
- (52)Java学习笔记——网络编程 / UDP协议
- contiki学习笔记-udp-server.c文件详细的解析
- 网络编程学习笔记(使用select函数的TCP和UDP回射服务器程序)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_视图_函数_存储过程_触发器等>(二十三)
- JAVA学习笔记Day24——javaTCP UDP网络编程Socket总结
- ArcGIS API For Flex对ImageServer发布的服务进行渲染及RasterFunction支持函数(学习笔记)