我試圖從運行在Linux上的計算機向網絡攝像機發送UDP數據報以發現它。所有設備都通過交換機連接。無法從Linux計算機向組播組發送UDP
有一個Windows應用程序與此攝像頭兼容,它向組播組發送UDP數據報並通過相同的組從攝像機獲取答案。我通過Wireshark發現了這一點,並決定嘗試從我的Linux機器上的C程序發送相同的數據報。如果我的C程序直接將它發送到攝像機的IP地址,我能夠得到正確的響應,但如果我將它發送到多播組,則不能。
我爲此在我的Linux計算機上創建了一個偵聽器程序,並試圖將其發送到多播地址。這成功了,但我沒有在Wireshark中捕捉到任何東西。
因此,我的C程序似乎能夠正確地發送數據報,而不是出現在網絡上。這可能是某種Linux配置嗎?
編輯:根據要求,這裏是代碼。僅供參考:截至目前,我只是試圖將數據發送到相機並檢查Wireshark中的響應。從udp_socket.h
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <errno.h>
#include "udp_socket.h"
int main(void)
{
//int s = udp_socket(50000);
int s = socket(AF_INET,SOCK_DGRAM,0);
printf("Socket: %d\r\n", s);
char buffer[48] = {0x67,0x45,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x67,0x45,0x00,0x00,0x14,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0xea,0xc8,0xc8,0xc8,0xf4,0xe6,0x00,0x00};
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(59125);
serveraddr.sin_addr.s_addr = inet_addr("234.200.200.200");
udp_socket_tx(s, buffer, sizeof(buffer), &serveraddr);
close(s);
}
udp_socket_tx():
int udp_socket_tx(int socket_fd, char * tx_buffer, int tx_buffer_len, const struct sockaddr_in * to_addr) {
return sendto(
socket_fd,
tx_buffer,
tx_buffer_len,
0,
(const struct sockaddr *)to_addr,
sizeof(struct sockaddr_in)
);
}
這當然是非常困難的沒有你的代碼,但你*加入*組播組首先在你的Linux程序? – unwind
網絡接口上必須允許組播。嘗試命令'ifconfig eth0 multicast'(用適配器ID替換eth0)。 – Marian
你可以附上你的代碼嗎? –