2010-10-18 49 views
25

Có cách nào gửi Ethernet gói dữ liệu đến máy chủ khác qua C# không? Trong Windows 7 nếu nó tạo sự khác biệt.Cách gửi gói ethernet thô với C#?

+2

gì bạn mong đợi xảy ra ở đầu bên kia? Bạn cũng vậy? Làm giao thức của riêng bạn? Có gì sai với những cái chúng ta đều sử dụng, phần cứng của bạn biết cách định tuyến và quản trị viên mạng LAN của bạn biết cách hỗ trợ như thế nào? –

+0

Tôi chỉ muốn gửi gói ethernet với một số trường đã thay đổi như địa chỉ MAC – Saint

+1

SharpPcap và Pcap.net là cách để thực hiện. Bạn cần một khung trình bao bọc WinPcap vì Windows không cho phép truy cập vào các tiêu đề giao thức cấp thấp hơn vì 'lý do bảo mật'. WinPcap cung cấp trình điều khiển mạng riêng cho phép bạn bỏ qua hạn chế đó. –

Trả lời

17

Dựa trên đề nghị bởi Saint_pl:

tôi tìm thấy giải pháp có lẽ tốt hơn - tương tự như SharpPcap. Đó là Pcap.Net - Trình bao bọc .NET cho WinPcap. Bây giờ tôi có thể sửa đổi các gói của tôi bất cứ điều gì tôi muốn.


Tôi có một số tài nguyên giúp bạn có thể hữu ích. Tôi không thử các giải pháp đó trong Windows 7 nhưng có lẽ nó chứa một số thông tin tốt để bắt đầu.

Raw Ethernet Packet Manipulation hoặc mirror on CodeProject

mục đích này của bài viết này là để giải thích làm thế nào để gửi một gói tin Ethernet liệu sử dụng C# trên nền tảng Microsoft. Gói Ethernet thô là khung mạng Lớp 2 hoàn chỉnh được gửi tới dây vật lý. Việc gửi một khung như thế này cho phép bạn thao tác các địa chỉ MAC đích và nguồn và các trường giao thức Lớp 3.

Ngoài ra một số thông tin trên các socket thô (chỉ trong trường hợp bạn thú vị quá):

Client (and Server) Sockets Communication có một cái nhìn về toàn bộ chương nhưng ở đây phần chính:

Không gửi các gói tin nhưng có lẽ thú vị: A Network Sniffer in C#, SharpPcap - A Packet Capture Framework for .NET

+0

Tôi nghĩ rằng gói Ethernet thô gửi từ CodeProject sẽ giúp tôi. Và btw tôi cho rằng đó là một và chỉ có cách mà tôi đã được tìm thấy để gửi gói ethernet với ví dụ thay đổi địa chỉ mac thông qua C#. – Saint

+0

Thao tác ethernet thô là khá thấp. Để hoàn thành nhiệm vụ của bạn ở mức độ tốt, bạn chắc chắn cần một số kiến ​​thức về Đặc điểm kỹ thuật giao diện trình điều khiển mạng và hiểu các trình điều khiển thiết bị (và API của nó). Đừng bỏ qua nó. C# một mình không cung cấp cho bạn toàn bộ sức mạnh trong nhiệm vụ đó. –

+2

Tôi thấy giải pháp tốt hơn - tương tự như SharpPcap. Đó là http://pcapdotnet.codeplex.com/ - .NET wrapper cho WinPcap. Bây giờ tôi có thể sửa đổi các gói của tôi bất cứ điều gì tôi muốn. Thanx :) – Saint

-3
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("10.25.184.11"), 4456); 

server.Connect(ip); 

byte[] sendData = new byte[] { 0, 8, 32, 64 }; 
server.Send(sendData); 

//done. now let's listen for data 

byte[] receiveData = new byte[1024]; 
int receivedDataLength = server.Receive(receiveData); 

//if the response is a string message 
string stringData = Encoding.ASCII.GetString(receiveData, 0, receivedDataLength); 
Console.WriteLine(stringData); 
+11

Đây là gói TCP, không phải gói ethernet ... Bạn có 2 lớp quá cao trên ngăn xếp;) –

+3

Tôi hiểu rồi. Hiểu lầm không thành công. – bufferz

+0

Ngoài ra điều này sẽ không hoạt động trên Windows 7. [Chỉ phiên bản máy chủ của cửa sổ cho phép sử dụng ổ cắm TCP thô] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548%28v=vs. 85% 29.aspx # LIMITATIONS_ON_RAW_SOCKETS) do lạm dụng phần mềm độc hại trong quá khứ. –

0

iphelper API có một số nội dung ở mức độ thấp - nhưng có lẽ không phải là khá thấp như bạn muốn để có được

Các vấn đề liên quan