開發平台(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會送給誰..我不知道,蠻難確認的