推 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
開發平台(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