// UDP服务器端 // server.c #include "wrapper.c" #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #define SERV_PORT 7777 int main(void) { int listenfd; ssize_t n; socklen_t clie_len; struct sockaddr_in clieaddr, servaddr; char buf[BUFSIZ]; // 创建socket listenfd = Socket(AF_INET, SOCK_DGRAM, 0); // 绑定地址 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);// INADDR_ANY表示本地的任意任意IP地址 servaddr.sin_port = htons(SERV_PORT); Bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr)); clie_len = sizeof(clieaddr); while (1) { if ((n = recvfrom(listenfd, buf, sizeof(buf), 0, (struct sockaddr*)&clieaddr, &clie_len)) == -1) { perr_exit("recvfrom error"); } if ((n = sendto(listenfd, buf, n, 0, (struct sockaddr*)&clieaddr, clie_len)) == -1) { perr_exit("sendto error"); } } return 0; }
// UDP客户端 // client.c #include "wrapper.c" #include <arpa/inet.h> #include <string.h> #include <sys/select.h> #define SERV_PORT 7777 int main(int argc, char **argv) { int sockfd; ssize_t n; char buf[BUFSIZ]; socklen_t serv_len; struct sockaddr_in servaddr; if (argc != 2) { perr_exit("usage: client <IPaddress>"); } sockfd = Socket(AF_INET, SOCK_DGRAM, 0); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr.s_addr) <= 0) { perr_exit("inet_pton error"); } serv_len = sizeof(servaddr); while (1) { n = Read(STDIN_FILENO, buf, sizeof(buf)); if ((n = sendto(sockfd, buf, n, 0, (struct sockaddr*)&servaddr, serv_len)) == -1) { perr_exit("sendto error"); } if ((n = recvfrom(sockfd, buf, n, 0, (struct sockaddr*)&servaddr, &serv_len)) == -1) { perr_exit("recvfrom error"); } Write(STDOUT_FILENO, buf, n); } return 0; }
/* wrapper.c */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> void perr_exit(const char * s) { perror(s); exit(1); } int Socket(int domain, int type, int protocol) { int sockfd; sockfd = socket(domain, type, protocol); if (sockfd == -1) { perr_exit("socket error"); } return sockfd; } void Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { int n; n = bind(sockfd, addr, addrlen); if (n == -1) { perr_exit("bind error"); } } ssize_t Read(int fd, void * buf, size_t count) { ssize_t n; n = read(fd, buf, count); if (n == -1) { perr_exit("read error"); } return n; } ssize_t Write(int fd, const void *buf, size_t count) { ssize_t n; n = write(fd, buf, count); if (n == -1) { perr_exit("write error"); } return n; }