// udp.c —— 原书 Figure 48.2:一个简单的 UDP 库 #include #include #include #include #include #include #include #include "udp.h" int UDP_Open(int port) { int sd; if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) // SOCK_DGRAM = UDP 数据报 return -1; struct sockaddr_in myaddr; bzero(&myaddr, sizeof(myaddr)); myaddr.sin_family = AF_INET; myaddr.sin_port = htons(port); // 端口号转成网络字节序(大端) myaddr.sin_addr.s_addr = INADDR_ANY; if (bind(sd, (struct sockaddr *) &myaddr, sizeof(myaddr)) == -1) { close(sd); return -1; } return sd; } int UDP_FillSockAddr(struct sockaddr_in *addr, char *hostname, int port) { bzero(addr, sizeof(struct sockaddr_in)); addr->sin_family = AF_INET; // host byte order addr->sin_port = htons(port); // network byte order struct in_addr *in_addr; struct hostent *host_entry; if ((host_entry = gethostbyname(hostname)) == NULL) // 命名:主机名 → IP 地址 return -1; in_addr = (struct in_addr *) host_entry->h_addr; addr->sin_addr = *in_addr; return 0; } int UDP_Write(int sd, struct sockaddr_in *addr, char *buffer, int n) { int addr_len = sizeof(struct sockaddr_in); return sendto(sd, buffer, n, 0, (struct sockaddr *) addr, addr_len); } int UDP_Read(int sd, struct sockaddr_in *addr, char *buffer, int n) { socklen_t len = sizeof(struct sockaddr_in); return recvfrom(sd, buffer, n, 0, (struct sockaddr *) addr, &len); } int UDP_Close(int sd) { return close(sd); }