绑定指定网卡发送udp报文
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 54321 // 服务器端口号
#define MAX_BUFFER_SIZE 1024
int main() {
int sockfd;
struct sockaddr_in server_addr, local_addr;
socklen_t server_addr_len = sizeof(server_addr);
char send_buffer[MAX_BUFFER_SIZE];
char recv_buffer[MAX_BUFFER_SIZE];
// 创建UDP套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
// 获取ens33网卡的IP地址
struct ifaddrs *ifaddr, *ifa;
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
close(sockfd);
exit(EXIT_FAILURE);
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == AF_INET &&
strcmp(ifa->ifa_name, "ens33") == 0) {
struct sockaddr_in *addr = (struct sockaddr_in *)ifa->ifa_addr;
struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(0); // 0表示让系统自动分配端口
local_addr.sin_addr = addr->sin_addr;
// 绑定到指定的网络接口
if (bind(sockfd, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1) {
perror("bind");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Bound to interface ens33 with IP address %s\n", inet_ntoa(addr->sin_addr));
break;
}
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {
perror("inet_pton");
exit(1);
}
while (1) {
// 发送数据
printf("请输入要发送的消息: ");
fgets(send_buffer, MAX_BUFFER_SIZE, stdin);
if (sendto(sockfd, send_buffer, strlen(send_buffer), 0,
(struct sockaddr *)&server_addr,
sizeof(server_addr)) == -1) {
perror("sendto");
exit(1);
}
// 接收响应
ssize_t recv_len = recvfrom(sockfd, recv_buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&server_addr, &server_addr_len);
if (recv_len == -1) {
perror("recvfrom");
exit(1);
}
recv_buffer[recv_len] = '\0'; // 添加字符串结束符
printf("收到响应: %s\n", recv_buffer);
}
// 关闭套接字
close(sockfd);
return 0;
}