UDP(User Datagram Protocol)Bind 基础概念
UDP 是一种无连接的传输层协议,提供不可靠的数据报服务。在 Linux 系统中,使用 bind()
函数可以将 UDP 套接字绑定到一个特定的本地地址和端口上。
相关优势
类型
应用场景
常见问题及解决方法
问题:UDP Bind 失败,提示“Address already in use”
原因:通常是因为之前的 UDP 连接没有完全关闭,导致端口仍然被占用。
解决方法:
netstat
或 lsof
命令查看端口占用情况。netstat
或 lsof
命令查看端口占用情况。示例代码
以下是一个简单的 UDP 服务器示例,展示如何绑定到一个特定的端口:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8888
#define BUFFER_SIZE 1024
int main() {
int sockfd;
struct sockaddr_in servaddr, cliaddr;
char buffer[BUFFER_SIZE];
// 创建 UDP 套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
// 配置服务器地址结构
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// 绑定套接字到指定端口
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
printf("UDP Server is up on port %d\n", PORT);
while (1) {
socklen_t len = sizeof(cliaddr);
int n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL,
(struct sockaddr *)&cliaddr, &len);
buffer[n] = '\0';
printf("Client : %s\n", buffer);
sendto(sockfd, (const char *)buffer, strlen(buffer), MSG_CONFIRM,
(const struct sockaddr *)&cliaddr, len);
}
close(sockfd);
return 0;
}
这个示例代码创建了一个简单的 UDP 服务器,绑定到端口 8888,并能够接收和回显客户端的消息。
领取专属 10元无门槛券
手把手带您无忧上云