與西門子PLC通訊,因為西門子PLC沒有設定IP(不能修改),只能通過MAC地址通訊,西門子SimaticNET軟體可以實作基于MAC地址通訊,現在我想實作鏈路層通訊,應該怎么辦?就是建立Socket的程序。
uj5u.com熱心網友回復:







uj5u.com熱心網友回復:




uj5u.com熱心網友回復:
不利用別的軟體,如何實作基于MAC 地址的socket通訊uj5u.com熱心網友回復:
你可以翻下sys/socket.h或者bits/socket.h,好像沒有mac這樣的地址型別uj5u.com熱心網友回復:
好奇, 鏈路層如何通信? 直接交換分組?uj5u.com熱心網友回復:
好奇。第一次感覺這個不錯uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
只想看看如何解決uj5u.com熱心網友回復:
learning~uj5u.com熱心網友回復:
如果是在二層網路傳輸資料的話,有MAC地址就夠了,因為交換機只認MAC地址。但是如果你要用socket來傳輸資料的話,需要驅動層協議堆疊的支持,并且提供socket相關的介面,不知道你的系統有沒有對應的驅動介面?如果沒有,自己寫或者移植linux內核的,估計作業量很大。
給你的一個建議:
如果沒有完整的協議堆疊和socket介面的話,你可以嘗試自己組包UDP和決議,這種四層協議很簡單,不需要復雜的協議堆疊,不需要維護連接狀態,組包后直接通過硬體發送就可以了(沒有IP的話,路由表也就省掉了);接收時,自己分析協議,拆掉二層頭,三層頭,四層頭,然后提取資料
uj5u.com熱心網友回復:
沒有設定ip,不等于沒有ip,沒有分配ip,或者DHCP自動分配ip失敗之后,會有一個169.254.xxx.xxx這個型別的ip地址的。
看看是不是會有這樣的ip存在。
使用mac地址通訊這么高大上的東西,真心沒用過。
個人腦洞大開一下,覺得不可能。如果可以,還要ip地址來干嘛。。。。。。。
uj5u.com熱心網友回復:
好奇,,頂一下uj5u.com熱心網友回復:
socket api, 能夠直接傳輸以太幀,表示很好奇?
arp包到時在資料鏈路層上, 不知道是怎么發送,接受的,
uj5u.com熱心網友回復:
arp包到時在資料鏈路層上, 不知道是怎么發送,接受的,
這句話請無視, 手打字錯了
uj5u.com熱心網友回復:
感謝大神分享uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
如果是在二層網路傳輸資料的話,有MAC地址就夠了,因為交換機只認MAC地址。
但是如果你要用socket來傳輸資料的話,需要驅動層協議堆疊的支持,并且提供socket相關的介面,不知道你的系統有沒有對應的驅動介面?如果沒有,自己寫或者移植linux內核的,估計作業量很大。
給你的一個建議:
如果沒有完整的協議堆疊和socket介面的話,你可以嘗試自己組包UDP和決議,這種四層協議很簡單,不需要復雜的協議堆疊,不需要維護連接狀態,組包后直接通過硬體發送就可以了(沒有IP的話,路由表也就省掉了);接收時,自己分析協議,拆掉二層頭,三層頭,四層頭,然后提取資料
socket api, 能夠直接傳輸以太幀,表示很好奇?
arp包到時在資料鏈路層上, 不知道是怎么發送,接受的,
提出這個問題的時候,請童靴自覺去看一下計算機網路基礎。。。。
基于以太網的通訊協議,所有在鏈路上傳輸的資料都會被網卡(網卡驅動)封裝成以太網幀,封裝以太網幀時發送程序的倒數第二步,最后一步就是通過硬體發送以太網幀到物理鏈路上(雙絞線或者光纖介質)。socket(嚴格來說,是socket相應的驅動部分)負責封裝四層頭(也就是tcp或者udp幀,ICMP等也可以勉強算作是四層協議),然后協議堆疊(嚴格來說,還應該加上路由表以及路由選路相關的驅動部分)負責封裝三層頭(也就是IP幀),最后由網卡驅動把IP幀封裝成以太網幀,由網卡送往物理鏈路。
好了,以上是理論,給你個實際點的,linux下的socket編程,可以通過PF_PACKET這個選項創建一個RAW socket,這個socket是可以直接發送以太網幀的,不過這個以太網幀是需要你自己組包的,socket只負責幫你送到物理鏈路上。
話題在轉回來,如果知道MAC地址,且只在二層網路上傳輸資料的話,那么只要知道對方的MAC地址就可以了,交換機就可以幫你把你的資料轉發給目的MAC所對應的主機,這時三層頭上的src和dst,以及四層頭上sport和dport都可以瞎寫(但是要注意效驗和問題,有些效驗和是硬體做的,如果效驗和不正確,網卡直接就把資料包丟了),因為這些資訊交換機并不提取,你寫啥對交換機而言都是無所謂的。
如果在二層網路上,你的資料能夠正確被送達目的地,那么接收的時候,就需要在網卡驅動這一層做處理(因為你的三層頭和四層頭都是瞎寫的,沒有相應的路由和協議堆疊來支撐你的資料到達應用層),在網卡驅動的收包很簡單,只要判斷目的MAC是否和網卡的MAC一致,一致就把包收上來,不一致就丟掉(注意ARP廣播和01開頭的組播,這兩個包網卡也會收上來),然后判斷一下,自己把瞎寫的三層和四層頭去掉,剩下的就是你所傳輸的資料了。
這里有個大膽的設想,我覺得你甚至可以去掉三層和四層頭,直接用以太網幀包你的資料,我覺得應該也可行,你可以嘗試一下。
uj5u.com熱心網友回復:
知道MAC地址直接發送資料肯定從邏輯上是沒問題的OSI 7層的模型也就是一層承載一層的“荷載”。。。
要從作業系統的出發點看這個問題,至少你不能直接用作業系統(WIN和*nux都不行)的網路介面API,更深一層是現成的網卡驅動程式API都不能用,要繞過作業系統直接去驅動網卡(寫出來的東西肯定是專機專用),而且很少網卡的SDK是開放到資料鏈路層的(intel的肯定行),那么就直接往網卡I/O硬體地址加載MAC地址,荷載,資料,校驗,成幀,TX/RX就行了。
何必要重做輪子?
uj5u.com熱心網友回復:
要是MAC改了怎么半?uj5u.com熱心網友回復:
不可能,西門子所有系列plc的網路模塊都能設定IPuj5u.com熱心網友回復:
通訊協議經過,tcp/ip封裝的,沒IP你不可能訪問uj5u.com熱心網友回復:
沒有ip,基于tcp/ip協議的通訊不可能實作。uj5u.com熱心網友回復:
如果是在二層網路傳輸資料的話,有MAC地址就夠了,因為交換機只認MAC地址。
但是如果你要用socket來傳輸資料的話,需要驅動層協議堆疊的支持,并且提供socket相關的介面,不知道你的系統有沒有對應的驅動介面?如果沒有,自己寫或者移植linux內核的,估計作業量很大。
給你的一個建議:
如果沒有完整的協議堆疊和socket介面的話,你可以嘗試自己組包UDP和決議,這種四層協議很簡單,不需要復雜的協議堆疊,不需要維護連接狀態,組包后直接通過硬體發送就可以了(沒有IP的話,路由表也就省掉了);接收時,自己分析協議,拆掉二層頭,三層頭,四層頭,然后提取資料
socket api, 能夠直接傳輸以太幀,表示很好奇?
arp包到時在資料鏈路層上, 不知道是怎么發送,接受的,
提出這個問題的時候,請童靴自覺去看一下計算機網路基礎。。。。
基于以太網的通訊協議,所有在鏈路上傳輸的資料都會被網卡(網卡驅動)封裝成以太網幀,封裝以太網幀時發送程序的倒數第二步,最后一步就是通過硬體發送以太網幀到物理鏈路上(雙絞線或者光纖介質)。socket(嚴格來說,是socket相應的驅動部分)負責封裝四層頭(也就是tcp或者udp幀,ICMP等也可以勉強算作是四層協議),然后協議堆疊(嚴格來說,還應該加上路由表以及路由選路相關的驅動部分)負責封裝三層頭(也就是IP幀),最后由網卡驅動把IP幀封裝成以太網幀,由網卡送往物理鏈路。
好了,以上是理論,給你個實際點的,linux下的socket編程,可以通過PF_PACKET這個選項創建一個RAW socket,這個socket是可以直接發送以太網幀的,不過這個以太網幀是需要你自己組包的,socket只負責幫你送到物理鏈路上。
話題在轉回來,如果知道MAC地址,且只在二層網路上傳輸資料的話,那么只要知道對方的MAC地址就可以了,交換機就可以幫你把你的資料轉發給目的MAC所對應的主機,這時三層頭上的src和dst,以及四層頭上sport和dport都可以瞎寫(但是要注意效驗和問題,有些效驗和是硬體做的,如果效驗和不正確,網卡直接就把資料包丟了),因為這些資訊交換機并不提取,你寫啥對交換機而言都是無所謂的。
如果在二層網路上,你的資料能夠正確被送達目的地,那么接收的時候,就需要在網卡驅動這一層做處理(因為你的三層頭和四層頭都是瞎寫的,沒有相應的路由和協議堆疊來支撐你的資料到達應用層),在網卡驅動的收包很簡單,只要判斷目的MAC是否和網卡的MAC一致,一致就把包收上來,不一致就丟掉(注意ARP廣播和01開頭的組播,這兩個包網卡也會收上來),然后判斷一下,自己把瞎寫的三層和四層頭去掉,剩下的就是你所傳輸的資料了。
這里有個大膽的設想,我覺得你甚至可以去掉三層和四層頭,直接用以太網幀包你的資料,我覺得應該也可行,你可以嘗試一下。
謝謝回復,你的思路對我很有用,非常感謝!
uj5u.com熱心網友回復:
關于ip的問題西門子plc可以通過tcp/ip通訊,也可以直接根據MAC地址通訊,由于現場沒有啟用ip,且運行系統不能修改,所以只能通過MAC進行通訊。
uj5u.com熱心網友回復:
你直接設個IP,只下載這個模塊的硬體配置,對運行系統沒有影響呀uj5u.com熱心網友回復:
如果是在二層網路傳輸資料的話,有MAC地址就夠了,因為交換機只認MAC地址。
但是如果你要用socket來傳輸資料的話,需要驅動層協議堆疊的支持,并且提供socket相關的介面,不知道你的系統有沒有對應的驅動介面?如果沒有,自己寫或者移植linux內核的,估計作業量很大。
給你的一個建議:
如果沒有完整的協議堆疊和socket介面的話,你可以嘗試自己組包UDP和決議,這種四層協議很簡單,不需要復雜的協議堆疊,不需要維護連接狀態,組包后直接通過硬體發送就可以了(沒有IP的話,路由表也就省掉了);接收時,自己分析協議,拆掉二層頭,三層頭,四層頭,然后提取資料
socket api, 能夠直接傳輸以太幀,表示很好奇?
arp包到時在資料鏈路層上, 不知道是怎么發送,接受的,
提出這個問題的時候,請童靴自覺去看一下計算機網路基礎。。。。
基于以太網的通訊協議,所有在鏈路上傳輸的資料都會被網卡(網卡驅動)封裝成以太網幀,封裝以太網幀時發送程序的倒數第二步,最后一步就是通過硬體發送以太網幀到物理鏈路上(雙絞線或者光纖介質)。socket(嚴格來說,是socket相應的驅動部分)負責封裝四層頭(也就是tcp或者udp幀,ICMP等也可以勉強算作是四層協議),然后協議堆疊(嚴格來說,還應該加上路由表以及路由選路相關的驅動部分)負責封裝三層頭(也就是IP幀),最后由網卡驅動把IP幀封裝成以太網幀,由網卡送往物理鏈路。
好了,以上是理論,給你個實際點的,linux下的socket編程,可以通過PF_PACKET這個選項創建一個RAW socket,這個socket是可以直接發送以太網幀的,不過這個以太網幀是需要你自己組包的,socket只負責幫你送到物理鏈路上。
話題在轉回來,如果知道MAC地址,且只在二層網路上傳輸資料的話,那么只要知道對方的MAC地址就可以了,交換機就可以幫你把你的資料轉發給目的MAC所對應的主機,這時三層頭上的src和dst,以及四層頭上sport和dport都可以瞎寫(但是要注意效驗和問題,有些效驗和是硬體做的,如果效驗和不正確,網卡直接就把資料包丟了),因為這些資訊交換機并不提取,你寫啥對交換機而言都是無所謂的。
如果在二層網路上,你的資料能夠正確被送達目的地,那么接收的時候,就需要在網卡驅動這一層做處理(因為你的三層頭和四層頭都是瞎寫的,沒有相應的路由和協議堆疊來支撐你的資料到達應用層),在網卡驅動的收包很簡單,只要判斷目的MAC是否和網卡的MAC一致,一致就把包收上來,不一致就丟掉(注意ARP廣播和01開頭的組播,這兩個包網卡也會收上來),然后判斷一下,自己把瞎寫的三層和四層頭去掉,剩下的就是你所傳輸的資料了。
這里有個大膽的設想,我覺得你甚至可以去掉三層和四層頭,直接用以太網幀包你的資料,我覺得應該也可行,你可以嘗試一下。
謝謝回復,你的思路對我很有用,非常感謝!
這個思路很棒,可以直接繞過IP做通訊傳輸,一大突破。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/94003.html
標籤:網絡通信
上一篇:思科ASA防火墻
