簡體   English   中英

從和向特定端口使用UDP發送單個RIPv2數據報?

[英]Send a single RIPv2 datagram using UDP from and to a specific port?

我分配了一個路由信息協議嗅探器,並使用C / C ++編寫了一個程序,該程序能夠使用從嗅探器收集的信息發送自定義RIP條目。

我都在學校提供的Ubuntu Virtualbox映像中運行這兩個映像,該映像通過“內部網絡”選項連接到運行生成RIP流量的路由守護程序的BSD映像。

我到達了需要將自定義數據包發送到“路由器”的部分,但是在嘗試從端口520發送數據包時遇到了麻煩。

從描述RIP協議的RFC 1058中,我收集到,為了使路由器確認新路由,RIP消息必須往返於端口520。

我可以很好地將數據包發送到路由器的端口520,但是在我的綁定失敗並顯示一條錯誤消息“無法分配請求的地址”后,源端口始終是系統分配的隨機端口。

除了源端口(例如60818)外,數據包本身在WireShark中看起來還不錯。

我在響應程序中執行以下操作:

#define ROUTERADDR "10.0.0.1"

int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in router;
router.sin_family      = AF_INET;
router.sin_port        = htons(520);
router.sin_addr.s_addr = inet_addr(ROUTERADDR);

bind    (fd, (struct sockaddr*)&router, sizeof(router));
connect (fd, (struct sockaddr*)&router, sizeof(router));

send(fd, &payload, sizeof(payload), 0);
close(fd);

除非將可執行文件添加到CAP_NET_BIND_SERVICE功能,否則綁定到<1024端口需要root權限。

setcap 'cap_net_bind_service=+ep' /path/to/executable

您的代碼中還有另一個問題,您試圖綁定到路由器的地址。 您需要綁定到特定的本地地址或INADDR_ANY,如下所示。

struct sockaddr_in local, router;
local.sin_family = AF_INET;
local.sin_port = htons(520);
local.sin_addr.s_addr = htonl(INADDR_ANY);
bind    (fd, (struct sockaddr*)&local, sizeof(local));

router.sin_family      = AF_INET;
router.sin_port        = htons(520);
router.sin_addr.s_addr = inet_addr(ROUTERADDR);
connect (fd, (struct sockaddr*)&router, sizeof(router));

您應該檢查系統調用的返回值,以便知道什么時候不起作用,例如, bind()調用可能會失敗。

在您的情況下,bind()會失敗,因為您嘗試綁定到您要發送的遠程地址上的端口,而您無法這樣做。

bind()指定要使用的本地端點,因此您應指定要從中發送的本地IP地址之一。 或者,您可以使用INADDR_ANY將套接字綁定到任何本地地址。 所以您可能想要創建另一個struct sockaddr_in並執行以下操作:

struct sockaddr_in my_addr;
my_addr.sin_family      = AF_INET;
my_addr.sin_port        = htons(520);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(fd, (struct sockaddr*)&my_addr, sizeof(my_addr)) != 0) {
   perror("bind() failed");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM