Giải pháp cho khám phá mạng LAN nhẹ?


9

Tôi đã xây dựng một thư viện để lập trình hoàn toàn đa nền tảng. Các trò chơi của tôi được thực hiện với nó chạy tốt trong Android, Pc, Linux, Mac, v.v.

Các khả năng kết nối mạng được cung cấp bởi thư viện ENET, do đó, tất cả giao tiếp giữa các ứng dụng của tôi không tương thích với TCP hoặc UDP, mà chỉ trong giao thức tùy chỉnh, thậm chí còn khó khăn dựa trên UDP.

Tôi không nghĩ có thể làm những gì tôi muốn với ENET, đó là lý do tại sao tôi yêu cầu sự giúp đỡ ở đây!

Hãy nói rằng tôi có cùng một trò chơi đang chạy trong điện thoại Android, máy tính xách tay và máy tính của tôi. Tất cả chúng đều nằm trong cùng một mạng wifi và do đó trong một mạng LAN, cho dù điểm phát Wifi (?) Hoặc bộ định tuyến gia đình.

Tôi cần mỗi người trong số 3 người đó để khám phá hai người kia trong mạng. Điều này chỉ có nghĩa là tìm IP của các ứng dụng còn sống trong mạng LAN, để có thể lưu trữ các trò chơi nhiều người chơi giữa chúng.

Tôi chỉ có thể nghĩ ra một cách hiệu quả để làm điều này, phát sóng UDP, chờ phản hồi, nhưng nếu đó là giải pháp, tôi cần một cái gì đó nhỏ, vì đó là mục đích duy nhất của việc thực hiện.

Một cách khác có thể là cố gắng kết nối với tất cả các IP trong phân nhóm địa chỉ LAN, nhưng tôi không nghĩ HĐH sẽ ở bên tôi trên trang này: p


2
Tôi nghĩ rằng một vài chương trình phát sóng UDP là cách để đi và tôi không hiểu sự phản đối của bạn đối với nó, hoặc là ENET không hỗ trợ phát sóng?
Roy T.

Chính xác, nó không, nó chỉ có thể phát sóng cho các đồng nghiệp đã được biết đến ..
Grimshaw

stackoverflow.com/questions/683624/ Từ Điều này có ảnh hưởng đến câu trả lời không?
Grimshaw

Câu trả lời:


5

Như nhiều người đã nói, giải pháp sẽ là sử dụng phát sóng UDP , nhưng có rất nhiều chi tiết triển khai liên quan. Gần đây tôi gặp vấn đề tương tự, và sau khi tìm ra giải pháp tôi đã tạo một bài đăng trên blog và một dự án mẫu dưới dạng máy chủ / máy khách trò chuyện LAN. Tôi sẽ tóm tắt những thứ ở đây, nhưng bạn nên kiểm tra chúng để biết thêm chi tiết và mã thực.

Đây là cách nó hoạt động, dựa trên mô tả của Lee Salzman, người tạo ra ENet:

  • Máy chủ trò chơi của bạn chạy trên một ổ cắm, dưới dạng máy chủ ENet
  • Máy chủ cũng liên kết với một cổng "nghe" đã biết, như một ổ cắm UDP thông thường (tức là không phải là máy chủ ENet)
  • Máy khách sẽ gửi một tin nhắn quảng bá UDP (tức là IP 255.255.255.255) đến cổng nghe đó và chờ phản hồi
  • Tất cả các máy chủ trong mạng LAN sẽ nhận được thông báo "quét" đó và phản hồi. Lý tưởng nhất là bạn có thể trả lời với cổng mà máy chủ trò chơi (máy chủ ENet) đang chạy; theo cách đó bạn không cần phải có máy chủ trò chơi của mình chạy trên một cổng cố định)
  • Sau khi khách hàng nhận được một số phản hồi, nó sẽ biết máy chủ nào có mặt. Sau đó, bạn có thể chọn một trong số chúng để kết nối, như một máy ngang hàng ENet thông thường. Tại thời điểm này, máy khách không cần ổ cắm "máy quét" UDP nữa.

Tin vui là ENet cung cấp các chức năng bao bọc để sử dụng các socket , vì vậy bạn có thể làm mọi thứ trong ENet. Tin xấu là vỏ bọc cực kỳ mỏng; bạn sẽ cần biết về lập trình ổ cắm , chẳng hạn như những gì select(). Đây là lý do tại sao tôi khuyến khích bạn hãy xem bài viết trên blogdự án mẫu để bạn có thể sao chép / dán mã và tiết kiệm cho mình nhiều thời gian.

Dưới đây là một số lưu ý và cạm bẫy mà bạn nên chọn để thực hiện:

  • Trình nghe / quét phải là UDP, vì vậy bạn cần tạo chúng bằng cách sử dụng enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM)(hoặc SOCK_DGRAMđể lập trình ổ cắm cũ đơn giản)
  • Đối với "người nghe" máy chủ, cho phép sử dụng lại địa chỉ cổng bằng cách sử dụng enet_socket_set_option(socket, ENET_SOCKOPT_REUSEADDR, 1)(hoặc SO_REUSEADDR) để nhiều máy chủ có thể chạy trên cùng một IP
  • Đối với "máy quét" máy khách, bạn phải bật phát trên ổ cắm UDP bằng cách sử dụng enet_socket_set_option(scanner, ENET_SOCKOPT_BROADCAST, 1)(hoặc SO_BROADCAST), nếu không bạn không thể gửi đến địa chỉ quảng bá. Đây chỉ là một tính năng an toàn , để làm cho việc vô tình làm ngập mạng khó hơn.

Thật không may, đây không chính xác là một giải pháp "nhẹ"; các đồng hồ dự án mẫu ở một vài trăm LỘC hoàn toàn. Sẽ thật tuyệt nếu điều này được đóng gói vào thư viện tiện ích cho ENet, nhưng tôi thấy rằng đối với các máy chủ trò chơi, bạn thường muốn gửi thêm một số thông tin cụ thể về trò chơi với phản hồi của máy chủ để làm cho điều này hữu ích, chẳng hạn như:

  • Loại trò chơi (ví dụ: "co-op", "deathmatch")
  • "Bản đồ", "cấp độ" hoặc "chiến dịch" máy chủ đang chạy
  • Số lượng người chơi và tối đa người chơi cho máy chủ
  • Bất kỳ thông tin cụ thể về trò chơi nào khác sẽ ảnh hưởng đến quyết định kết nối của khách hàng hay không. Hãy suy nghĩ về "trình duyệt máy chủ" trong các trò chơi và loại thông tin mà chúng hiển thị.

Đây chính xác là những gì tôi đã nghĩ. Phát sóng là con đường để đi.
Lolums

3

Khi bạn không muốn rời khỏi thư viện của mình, bạn có thể sử dụng brute-force và cố gắng kết nối với từng địa chỉ có thể. Hầu hết các khoản vay tại nhà là mạng Class-C (/ 24) trong đó 24 bit đầu tiên của địa chỉ IP là như nhau và 8 bit cuối cùng khác nhau. Vì vậy, bạn chỉ có 255 địa chỉ IP có thể.

Tuy nhiên, thực hiện phát sóng UDP sẽ là sự thay thế sạch hơn. Chỉ cần gửi một gói UDP đến 255.255.255.255 và tất cả các máy khách phía sau cùng một bộ định tuyến sẽ nhận được nó. Sau đó, họ có thể gửi trả lời đến IP nguồn và cổng nguồn của gói để thông báo cho người gửi rằng họ có mặt.


2
Xin vui lòng xin vui lòng xin vui lòng không vũ phu.
Trevor Powell

@TrevorPowell ... bởi vì ...?
Phi

2
Bởi vì đó là giải pháp sai. Nó sẽ không hoạt động trong các trường đại học (không sử dụng mạng lớp c) hoặc tại các doanh nghiệp (thường không sử dụng mạng lớp c) và nhân viên CNTT ở một trong hai sẽ cực kỳ không thích tải do mọi người chơi tạo ra brute-force cố gắng gửi tin nhắn đến mọi địa chỉ IP trong mạng của họ mỗi khi họ nhấp vào nút 'refresh'. Đó chỉ là một giải pháp tồi cho vấn đề . Câu hỏi về việc định vị các đồng nghiệp tiềm năng mà không cần máy chủ làm toán là chính xác những gì phát sóng là dành cho. Sử dụng phát sóng. Nó tốt hơn về mọi mặt. :)
Trevor Powell

1

Bạn có thể xem DNS-SD / ZeroConf / Avahi / Bonjour / mDNS . Đó là thứ Apple sử dụng để chia sẻ máy in, thư mục iTunes, v.v. nhưng nó đã được chấp nhận ở nơi khác. Avahi là phiên bản mã nguồn mở mà Linux sử dụng (không chắc chỉ có Linux), không chắc toàn bộ tính di động như thế nào (mặc dù có các triển khai cho hầu hết các nền tảng).

Như đã nói, có lẽ việc phát sóng UDP có lẽ dễ dàng hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.