Trong linux, làm thế nào tôi có thể truyền gói UDP bằng cách sử dụng 0.0.0.0 làm địa chỉ nguồn.Truyền gói UDP với địa chỉ nguồn 0.0.0.0
Đây là những gì tôi đã thử cho đến nay.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <net/if.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(int argc, const char *argv[])
{
struct sockaddr_in dst, src;
struct ifreq ifr;
int sock, tmp;
char payload[128];
memset(payload, 0, 128);
memset(&dst, 0, sizeof(dst));
dst.sin_family = AF_INET;
dst.sin_addr.s_addr = inet_addr("255.255.255.255");
dst.sin_port = htons(67);
memset(&src,0,sizeof(src));
src.sin_family = AF_INET;
src.sin_addr.s_addr = inet_addr("0.0.0.0");
src.sin_port = htons(68);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
perror("Failed to create socket");
tmp = 1;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &tmp, sizeof(tmp)) < 0)
perror("SO_BROADCAST failed");
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(tmp)) < 0)
perror("SO_REUSEADDR failed");
if (setsockopt(sock, IPPROTO_IP, IP_FREEBIND, &tmp, sizeof(tmp)) < 0)
perror("IP_FREEBIND failed");
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "eth1", sizeof(ifr.ifr_name));
if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0)
perror("SO_BINDTODEVICE failed");
if (bind(sock, (const struct sockaddr*)&src, sizeof(struct sockaddr_in)) < 0)
perror("bind failed");
if (connect(sock, (const struct sockaddr*)&dst, sizeof(struct sockaddr_in)) < 0)
perror("bind failed");
if (write(sock, payload, 128) < 0)
perror("Write failed");
close(sock);
return 0;
}
Vấn đề là địa chỉ nguồn chỉ được đặt thành 0.0.0.0 nếu không có giao diện nào có địa chỉ IPv4. Nếu chỉ có một giao diện có địa chỉ IPv4, địa chỉ này được sử dụng làm địa chỉ nguồn.
Tôi đã xem mã nguồn của một số máy khách DHCP hiện có và thấy rằng chúng đang sử dụng ổ cắm RAW và xây dựng tiêu đề IP và UDP theo cách thủ công. Đây là khả năng, nhưng tôi muốn tránh làm điều này bằng tay.
Nếu không có giao diện nào có địa chỉ IPv4, bạn không thể gửi gói nào cả ... – glglgl
@glglgl làm cách nào để gửi DHCP phát hiện sau đó (cần chính xác điều này)? – KillianDS
Có thể sử dụng ổ cắm RAW ... – glglgl