2012-10-27 35 views
5

Tôi đang cố gắng xây dựng một ứng dụng netowrk. Tôi đã thực hiện thành công một máy chủ gửi và nhận các gói. Cho đến nay, thử nghiệm đã được thực hiện trên một máy tính trỏ đến 127.0.0.1 (Không có nơi nào như nhà). Bây giờ tôi muốn chuyển sang mạng. Làm thế nào tôi có thể tìm thấy các máy tính trên mạng LAN đang nghe cổng cụ thể của tôi?Tìm cổng TCP đang mở trong một mạng

+0

Cho ip của máy đó thay vì 127.0.0.1 – Adil

+0

Bạn chỉ quan tâm đến mạng con hoặc bạn có muốn kiểm tra các máy tính khả dụng có thể có trong mạng con khác không? –

+0

Vâng, nhưng câu hỏi của tôi là tìm các cổng thực tế. Bằng cách đó tôi có thể sử dụng nó mà không cần mã hóa IP của – Samyn

Trả lời

4

Dịch vụ sẽ cần nghe broadcast messages trên cổng đã biết (nếu bạn muốn thực sự cư xử tốt, bạn có thể register the program and port number with the IANA), khi nghe tin nhắn phát sóng, nó trả lời người gửi IP của máy chủ và dịch vụ cổng là gì lắng nghe các kết nối đến. Dưới đây là một ví dụ đơn giản từ liên kết ở trên, điều này chỉ in cho giao diện điều khiển đã kết nối và trên cổng nào, nhưng bạn có thể sử dụng thông tin này để thiết lập kết nối TCP hoặc UDP giữa hai điểm cuối. Quay lại đầu trang

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
class RecvBroadcst 
{ 
    public static void Main() 
    { 
    Socket sock = new Socket(AddressFamily.InterNetwork, 
      SocketType.Dgram, ProtocolType.Udp); 
    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); 
    sock.Bind(iep); 
    EndPoint ep = (EndPoint)iep; 
    Console.WriteLine("Ready to receive…"); 
    byte[] data = new byte[1024]; 
    int recv = sock.ReceiveFrom(data, ref ep); 
    string stringData = Encoding.ASCII.GetString(data, 0, recv); 
    Console.WriteLine("received: {0} from: {1}", 
       stringData, ep.ToString()); 
    data = new byte[1024]; 
    recv = sock.ReceiveFrom(data, ref ep); 
    stringData = Encoding.ASCII.GetString(data, 0, recv); 
    Console.WriteLine("received: {0} from: {1}", 
       stringData, ep.ToString()); 
    sock.Close(); 
    } 
} 

Như một ví dụ psudo đây là chuỗi các sự kiện trên thế nào tôi sẽ làm điều đó.

Ví dụ này cho phép nói rằng chúng tôi có mạng có IP là 192.168.1.0 và mạng con là 255.255.255.0. Chúng tôi có hai máy chủ, Server1 tại 192.168.1.2 với dịch vụ nghe trên cổng 1234Server2 tại 192.168.1.3 với cổng 4567 cho dịch vụ. Cả hai đều được liệt kê trên cổng 3000 cho các tin nhắn quảng bá. Các khách hàng kết nối sẽ nằm ở IP 192.168.1.4

  1. Khách hàng chọn một cổng ngẫu nhiên trong dynamic port range (49.152-65.535) và liên kết với nó trên UDP (cảng 50.123 ví dụ này) và lắng nghe.
  2. Khách hàng phát sóng đến địa chỉ quảng bá và cổng đã biết cho mạng con cục bộ của mình (192.168.1.255:3000) bằng cùng một cổng để gửi khi đang nghe. Anh ta gửi một số loại tải trọng để các máy chủ chỉ gửi lại cho khách hàng của bạn, thay vì một người khác đã từng sử dụng cùng một cổng như bạn. (cho phép nói rằng nó sẽ gửi chuỗi Send me your info for XYZ app!)
  3. Server1 nhận được chương trình phát sóng. Kiểm tra xem thư có phải là Send me your info for XYZ app! và gửi thông báo UDP Name:Server1 IP:192.168.1.2 Port:1234 quay lại cổng nguồn của người gửi và kết hợp IP (192.168.1.4:50123)
  4. Server2 cũng nhận được chương trình phát sóng. Kiểm tra xem thư có phải là Send me your info for XYZ app! và gửi thông báo UDP Name:Server2 IP:192.168.1.3 Port:4567 trở lại cổng nguồn của người gửi và kết hợp IP (192.168.1.4:50123)
  5. Máy khách nhận được hai thư UDP trên cùng một cổng mà anh đã gửi thư. Ông phân tích các câu trả lời và hiển thị cho người dùng hai máy chủ có sẵn để kết nối.
Các vấn đề liên quan