⑴ linux的程序收不到組播數據,但用tcpmp卻可以收到,我用另外一台機器測試用同樣的程序接收卻沒有問題
tcpmp是從網卡上捕的數據包,如果程序沒有問題,就是內核協議棧把數據包丟掉了,看看防火牆開著沒,把它關了試試。
⑵ linux中inaddr_broadcast什麼意思
廣播地址。
專門用於同時向網路中(通常指同一子網)所有工作站進行發送的一個地址。在使用TCP/IP 協議的網路中,主機標識段host ID(簡稱主機 ID) 為全 1 的 IP 地址為廣播地址,廣播的分組傳送給同一個子網的所有計算機。
例如:
對於10.1.1.0 (255.255.255.0 )網段,其廣播地址為10.1.1.255 (255 即為 2 進制的 11111111 ),當發出一個目的地址為10.1.1.255 的數據包時,它將被分發給該網段上的所有計算機。廣播地址應用於網路內的所有主機。
分類
1、受限廣播
路由器不會轉發受限廣播的數據包,但同一個子網的所有主機都會接收到受限廣播的數據包。
IP 地址的網路欄位和主機欄位全為 1 就是受限廣播地址255.255.255.255。
2、直接廣播(也叫定向廣播)
直接廣播可以被路由轉發,發送到目標網路的所有主機,如:ip地址為 192.168.2.1 的主機也可以發送廣播到192.168.1.0這個網路。當然不是所有的路由器,傻瓜式路由器是默認阻止直接廣播的。
IP 地址的網路欄位定義這個網路,主機欄位通常全為 1,如192.168.10.0/24 的直接廣播(定向廣播)地址為:192.168.10.255。
⑶ linux下的UDP通訊怎麼接受不到廣播
說明:把廣播地址改為伺服器地址時接收正常 ?
如果接收正常就OK了?你發送到廣播地址,接收到的是伺服器發出的.
發送 -> to 255.255.255.255
接受 -> bind 0.0.0.0 -> from server_addr
要不然就是你沒有說清楚
---------------------------
你希望伺服器收到自己的廣播?那個不是保證可以正確的。不一定會收到幾個,也可能沒有。
⑷ linux上,組播包已經到了機器,抓包可見,但應用層收不到,為什麼
估計會話層 表示層 應用層有問題,當然我是瞎猜。
⑸ 關於linux下udp廣播包
你確認你的廣播包在eth0和wlan0上都發出了嗎?我估計只在eth0上發了。
教你一個辦法確認,在linux上使用tcpmp 抓包:
tcpmp -i eth0
tcpmp -i wlan0
⑹ 求一linux接收udp廣播程序(提供模板)
哥們,沒bind你收啥?你又把my_addr傳給recvfrom幹啥(該傳their_addr).
我給你寫了個
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
int main()
{
int n, fd;
socklen_t cli_addr_len;
char buf[1024] = {0};
struct sockaddr_in servaddr, cliaddr;
if((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("socket error!\n");
exit(0);
}
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);
bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while(1)
{
cli_addr_len = sizeof(cliaddr);
n =recvfrom(fd, buf, 1024, 0, (struct sockaddr *)&cliaddr, &cli_addr_len);
printf("%d\n", n);
}
}
這個程序只能收到發往本機IP地址和廣播地址的埠為9999的數據包,如果你要監聽區域網中的所有廣播包(任意埠),可以用原始套接字,我前兩天正好寫了個,功能很強大哦:),已經是個嗅探器了,你用的時候加上 -u 選項就可以了。
famdestiny.cublog.cn