2012-03-08 34 views
7

Tôi hiện đang làm việc trên một tiện ích trò chuyện nhỏ trong C#.
Vấn đề là tôi không thể tìm ra cách quét mạng cho một cổng cụ thể trên tất cả các máy. Tôi hiện đang sử dụng phương pháp nàyCách quét cổng chờ kết nối trên mạng

IPGlobalProperties network = IPGlobalProperties.GetIPGlobalProperties(); 
    IEnumerable<IPEndPoint> connections = network.GetActiveTcpListeners() 
                 .Where(x => x.Port == ConstParams.iPort); 

nơi cổng mà tôi muốn quét (6910 tại đây).

Vấn đề là các giá trị trả chỉ có cổng nội bộ và "0.0.0.0" địa chỉ ip ...

Làm thế nào tôi có thể quét tất cả các cổng mở (6910) trên mạng hiện nay?

+1

Nhìn vào mô tả về cách * nmap * công trình có thể giúp bạn. –

Trả lời

9

Thay vì sử dụng chức năng quét cổng, tôi khuyên bạn nên thực hiện một cơ chế phát hiện đơn giản dựa trên multicast/truyền thông phát sóng.

Trong khi khởi động, ứng dụng sẽ phát/phát đa hướng thông tin IP/Cổng của nó. Tất cả các cá thể đang chạy sẽ phản hồi thông báo này bằng thông tin IP/Cổng của chúng. Loại cơ chế khám phá này dễ thực hiện, và nó nhanh hơn cả trong thời gian chạy và năng động hơn so với phương pháp quét cổng.

+0

Bạn có thể hiển thị một số ví dụ không? – rkmax

0

GetIPGlobalProperties chỉ trả về thông tin về máy địa phương của bạn (xem http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.getipglobalproperties.aspx).

Để tìm hiểu xem máy nào khác trên mạng có cổng đó mở, bạn phải lặp qua một loạt các IP, cố gắng kết nối trên cổng đó. Không có kho trung tâm để truy vấn về điều này.

Bài viết này mô tả một cách tiếp cận: http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/

1

Quét cổng là một lựa chọn không tốt, rất có thể bạn sẽ kích hoạt tường lửa trên các máy trong mạng để hiển thị máy của bạn là kẻ tấn công. Bất kỳ hệ thống phát hiện xâm nhập nào trên mạng cũng có thể được kích hoạt. Đó là rất nhiều chi phí cho những gì bạn cần.

tôi sẽ khuyên bạn nên làm một phát sóng sử dụng UDP hoặc multicast để khám phá các khách hàng khác http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C

Một lựa chọn khác là nên có một máy chủ tập trung, hoặc trên một máy chủ web (php kịch bản, trang asp.net, vv) hoặc dịch vụ web (REST) ​​mà ứng dụng trò chuyện sẽ kết nối khi khởi động, POST đang nghe IP/Cổng và sau đó sẽ nhận danh sách tất cả IP/Cổng được công bố gần đây của các khách hàng khác trên mạng. Bạn có thể muốn một số vẫn còn sống ở đây, IE: khách hàng sẽ POST đến trang mỗi 5 phút, nếu một IP không POST trong 10 phút, nó sẽ được loại bỏ khỏi danh sách.

Để có được IP công cộng của máy, bạn có thể kiểm tra trang này: http://www.whatismyip.com/faq/automation.asp

Bạn sẽ chỉ cần gửi một yêu cầu web để nó để lấy IP. Nếu bạn muốn nhận được không 0.0.0.0/127.0.0.1 IP của giao diện địa phương, bạn có thể kiểm tra các bài viết:

Get local IP address

How do I get the Local Network IP address of a computer programmatically? (C#)

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