看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我太無聊了想用兩張網卡拿raw socket做bridge 至於這個可以做什麼就..嘿嘿 餵入的資料(Input): 開兩個raw socket int sockin = socket(PF_PACKET, RAW_SOCK, htons(ETH_P_ALL); int sockout = socket(PF_PACKET, RAW_SOCK, htons(ETH_P_ALL); 註 promisc已經用其他方法處理好了 然後bind socket setsockopt(sockin, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4); setsockopt(sockout, SOL_SOCKET, SO_BINDTODEVICE, "eth1", 4); 然後recv資料 n = recvfrom(sockin, buf, 1500, (struct sockaddr *)&rcvaddr, &len); 稍微修改一下rcvaddr的資料: rcvaddr.sll_pkttype = 0; rcvaddr.sll_hatype = 0; rcvaddr.sll_ifindex = 3; //eth0的 index是2, eth1 的index是3 m = sendto(sockout, buf, 1500, (struct sockaddr *)&rcvaddr, sizeof(struct sockaddr); 至此編譯完執行,一端就通了 預期的正確結果(Expected Output): 理論上另一端執行完應該也要能通, 但是卻出現了怪事。從eth0收到的資料往eth1丟時 另一個eth1接收的軟體覺得socket裡面有東西又把它撈了出來,又丟回eth0 結果封包像是乒乓球一樣在兩個recv的socket中瘋狂地轉送 現在我是有用個判斷,偷看ethernet表頭讓這個轉送停下來, 但是相對效能就變差了。 想請問一下,這樣的socket現象是正常的嗎? 就是sendto的封包會被另外一隻recvfrom從socket又收回來 有沒有什麼flag可以強制他不要收送出的封包? 其他做過的測試,我試過不要bind, 這更可怕,recvfrom的指令兩邊都收的到根本大雜燴 所以bind是有用的, 至於沒有bind的時候sendto會送給誰..我不知道,蠻難確認的 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.200.71 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1566287792.A.675.html
Schottky: 區域網路怎麼接的 08/21 02:52
網路的話 設備總共有三台, eth0 eth1 PC1 <--------------> PC2 <----------------> PC3 IP: 192.168.1.200 192.168.1.105 192.168.1.100 NA 既然是bridge,其實PC2的eth0也可以不用IP 試過不用IP,但是封包還是在那亂彈 比較特別的是PC2的 ARP table 192.168.1.200 <MAC> on eth0 192.168.1.105 <MAC> on eth1 192.168.1.105 <incomplete> on eth0 <====????? 不過也有可能是程式亂跳讓系統誤以為那邊也有一台105, 所以把ARP包往那邊丟 但是想當然耳,那邊什麼都沒有 ※ 編輯: chigi (1.160.200.71 臺灣), 08/21/2019 09:17:34