本文共 2311 字,大约阅读时间需要 7 分钟。
UDP C/S 编程
UDP 的工作模式与 TCP 有明显的区别。在 UDP 编程中,服务器端不需要设置监听(Listen)和等待连接(Accept)的过程,而客户端也不需要主动连接到服务器端。
UDP通信的特点是不可靠且面向“无连接”(Unreliable)。发送的数据无法确切知道对方是否收到,即使对方并不存在,也可以自由发送数据。这使得 UDP通信适用于对可靠性和安全性要求不高的场景,比如语音通信(用户可以根据语音内容选择是否发送)。
以下是一个简单的 UDP 服务器示例:
#include#include #include #include #include #include #include int main(int argc, char **argv) { if (argc != 2) { printf("Usage: %s port\n", argv[0]); exit(1); } printf("Welcome! This is a UDP server, ready to receive messages.\n"); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(strtoimax(argv[1], NULL, 10)); addr.sin_addr.s_addr = htonl(INADDR_ANY); int sock; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(1); } char buffer[512]; struct sockaddr_in client_addr; int len = sizeof(client_addr); while (1) { int n = recvfrom(sock, buffer, 511, 0, (struct sockaddr *)&client_addr, &len); if (n > 0) { printf("%s:%u says: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer); n = sendto(sock, buffer, n, 0, (struct sockaddr *)&client_addr, sizeof(client_addr)); if (n < 0) { perror("sendto"); break; } } else { perror("recv"); break; } } return 0;}
UDP客户端示例:
#include#include #include #include #include #include #include int main(int argc, char **argv) { if (argc != 3) { printf("Usage: %s ip port\n", argv[0]); exit(1); } printf("This is a UDP client.\n"); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(strtoimax(argv[2], NULL, 10)); addr.sin_addr.s_addr = inet_addr(argv[1]); if (addr.sin_addr.s_addr == INADDR_NONE) { printf("Incorrect IP address!\n"); close(sock); exit(1); } char buffer[512]; int len = sizeof(addr); while (1) { gets(buffer); int n = sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr *)&addr, sizeof(addr)); if (n < 0) { perror("sendto"); close(sock); break; } n = recvfrom(sock, buffer, 512, 0, (struct sockaddr *)&addr, &len); if (n > 0) { printf("Received: %s\n", buffer); } else if (n == 0) { printf("Server closed\n"); break; } else if (n == -1) { perror("recvfrom"); break; } } return 0;}
转载地址:http://yswfk.baihongyu.com/