হালকা ল্যান পিয়ার আবিষ্কারের সমাধান?


9

খাঁটি ক্রস প্ল্যাটফর্ম প্রোগ্রামিংয়ের জন্য আমি একটি লাইব্রেরি তৈরি করেছি। এটি দিয়ে তৈরি আমার গেমগুলি অ্যান্ড্রয়েড, পিসি, লিনাক্স, ম্যাক ইত্যাদিতে সূক্ষ্মভাবে চলে

নেটওয়ার্কিং ক্ষমতা এএনইটি লাইব্রেরি দ্বারা সরবরাহ করা হয়, সুতরাং আমার অ্যাপ্লিকেশনগুলির মধ্যে সমস্ত যোগাযোগ টিসিপি বা ইউডিপি সামঞ্জস্যপূর্ণ নয়, তবে কেবলমাত্র কাস্টম প্রোটোকলে, এমনকি এটি ইউডিপি ভিত্তিতে অবশেষে শক্ত।

আমি ENET দিয়ে যা চাই তা করা সম্ভব বলে আমি মনে করি না, কেন আমি এখানে সাহায্যের জন্য জিজ্ঞাসা করি!

আসুন বলুন যে আমার অ্যান্ড্রয়েড ফোন, আমার ল্যাপটপ এবং আমার পিসিতে একই খেলা চলছে। এগুলি সমস্ত একই ওয়াইফাই নেটওয়ার্কে রয়েছে এবং তাই ল্যানটিতে তার ওয়াইফাই হটস্পট (?) বা ঘরোয়া রাউটার কিনা।

নেটওয়ার্কে অন্য দু'জনকে আবিষ্কার করার জন্য আমার সেই 3 জন সমবয়সীর প্রত্যেকের প্রয়োজন। এটি কেবল ল্যান নেটওয়ার্কে জীবিত অ্যাপ্লিকেশনগুলির আইপি সন্ধান করার জন্য, তাদের মধ্যে মাল্টিপ্লেয়ার গেম হোস্ট করতে সক্ষম।

আমি কেবল এটির একটি কার্যকর উপায় সম্পর্কে ভাবতে পারি, ইউডিপি সম্প্রচার, প্রতিক্রিয়া অপেক্ষা করুন, তবে যদি সমাধান হয় তবে আমার ছোট কিছু দরকার, কারণ এটি বাস্তবায়নের একমাত্র উদ্দেশ্য।

ল্যান অ্যাড্রেস সাবগ্রেনে সব আইপি সংযোগ করার চেষ্টা করার অন্য উপায় হতে পারে, তবে আমি মনে করি না যে ওএস এই সাথে আমার সাথে থাকবে: পি


2
আমি মনে করি কয়েকটি ইউডিপি সম্প্রচার হ'ল উপায়, এবং আমি এটি সম্পর্কে আপনার আপত্তি বুঝতে পারি না, বা এএনইটি সম্প্রচারকে সমর্থন করে না?
রায় টি।

হুবহু, এটি হয় না, এটি কেবল ইতিমধ্যে পরিচিত সমবয়সীদের কাছে সম্প্রচার করতে পারে ..
গ্রিমশো

stackoverflow.com/questions/683624/… এটি কোনও উত্তরকে প্রভাবিত করে?
গ্রিমশো

উত্তর:


5

যেহেতু অনেকেই বলে আসছেন, সমাধানটি হবে ইউডিপি সম্প্রচারকে ব্যবহার করা , তবে এর সাথে প্রয়োগের অনেকগুলি বিবরণ রয়েছে। আমি সম্প্রতি একই সমস্যায় পড়েছি এবং সমাধান বের করার পরে আমি একটি ব্লগ পোস্ট তৈরি করেছি এবং ল্যান চ্যাট সার্ভার / ক্লায়েন্টের আকারে একটি নমুনা প্রকল্প । আমি এখানে এগুলির সংক্ষিপ্তসার করব, তবে আপনাকে আরও বিশদ এবং বাস্তব কোডের জন্য এটি পরীক্ষা করা উচিত।

এনেটের স্রষ্টা লি সালজম্যানের বর্ণনার ভিত্তিতে এটি কীভাবে কাজ করে তা এখানে রয়েছে:

  • আপনার গেম সার্ভারটি একটি সকেটের উপর, একটি এনেট হোস্ট হিসাবে চলে
  • নিয়মিত ইউডিপি সকেট হিসাবে সার্ভারটি একটি পরিচিত "শোনো" পোর্টের সাথেও আবদ্ধ হয় (যেমন কোনও এনএইচ হোস্ট নয়)
  • ক্লায়েন্ট সেই শোনার বন্দরে একটি ইউডিপি সম্প্রচার বার্তা (অর্থাত্ আইপি 255.255.255.255) প্রেরণ করে এবং প্রতিক্রিয়াগুলির জন্য অপেক্ষা করে
  • ল্যানের সমস্ত সার্ভারগুলি "স্ক্যানিং" বার্তাটি গ্রহণ করবে এবং প্রতিক্রিয়া জানাবে। গেম সার্ভার (ENET হোস্ট) যে পোর্টটি চলছে তার সাথে আপনি প্রতিক্রিয়া জানাতে পারেন; এইভাবে আপনার গেম সার্ভারটি একটি স্থির বন্দরে চলতে হবে না)
  • ক্লায়েন্টটি কিছু প্রতিক্রিয়া পাওয়ার পরে এটি জানতে পারবে কোন সার্ভার উপস্থিত রয়েছে। তারপরে আপনি নিয়মিত এনেট পিয়ার হিসাবে সংযুক্ত হওয়ার জন্য তাদের মধ্যে একটি চয়ন করতে পারেন। এই মুহুর্তে ক্লায়েন্টের আর ইউডিপি "স্ক্যানার" সকেটের প্রয়োজন নেই।

সুসংবাদটি হ'ল এনেট সকেটগুলি ব্যবহারের জন্য মোড়ক ফাংশন সরবরাহ করে , যাতে আপনি এনেটে সবকিছু করতে পারেন। খারাপ খবরটি হ'ল মোড়কটি অত্যন্ত পাতলা; আপনাকে সকেট প্রোগ্রামিং সম্পর্কে জানতে হবে , যেমন কী select()করে। এজন্য আমি আপনাকে ব্লগ পোস্ট এবং নমুনা প্রকল্পটি একবার দেখার জন্য উত্সাহিত করি যাতে আপনি কোডটি অনুলিপি / আটকান এবং নিজেকে প্রচুর সময় বাঁচাতে পারেন।

আপনার নিজের প্রয়োগটি বেছে নেওয়ার জন্য এখানে কয়েকটি নোট এবং সমস্যাগুলি দেওয়া উচিত:

  • শ্রোতা / স্ক্যানার অবশ্যই ইউডিপি হওয়া উচিত , সুতরাং আপনার এগুলি ব্যবহার করে তৈরি করা দরকার enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM)(বা SOCK_DGRAMসাধারণ পুরানো সকেট প্রোগ্রামিংয়ের জন্য)
  • "শ্রোতা" সার্ভারের জন্য, enet_socket_set_option(socket, ENET_SOCKOPT_REUSEADDR, 1)(বা SO_REUSEADDR) ব্যবহার করে পোর্ট ঠিকানাটি পুনরায় ব্যবহার করার অনুমতি দিন যাতে একাধিক সার্ভার একই আইপিতে চলতে পারে
  • ক্লায়েন্ট "স্ক্যানার" এর জন্য আপনাকে ইউডিপি সকেটে enet_socket_set_option(scanner, ENET_SOCKOPT_BROADCAST, 1)(বা SO_BROADCAST) ব্যবহার করে সম্প্রচার সক্ষম করতে হবে , অন্যথায় আপনি সম্প্রচারের ঠিকানায় প্রেরণ করতে পারবেন না। দুর্ঘটনাক্রমে নেটওয়ার্ক প্লাবন করা আরও শক্ত করে তোলা এটি কেবল একটি সুরক্ষা বৈশিষ্ট্য

দুর্ভাগ্যক্রমে এটি ঠিক "লাইটওয়েট" সমাধান নয়; নমুনা প্রকল্প পুরোপুরি কয়েক শতাধিক এলওসি-তে দাঁড়িয়ে আছে। এটি এনেটের কোনও ইউটিলিটি লাইব্রেরিতে প্যাকেজ করা থাকলে ভাল হবে তবে আমি খুঁজে পেয়েছি যে গেম সার্ভারগুলির জন্য আপনি প্রায়শই এই দরকারীটি তৈরি করতে সার্ভারের জবাবের সাথে আরও কিছু গেম-নির্দিষ্ট তথ্য প্রেরণ করতে চান, যেমন:

  • গেমের ধরণ (যেমন "কো-অপ", "ডেথ ম্যাচ")
  • "মানচিত্র", "স্তর" বা "প্রচার" সার্ভার চলছে
  • সার্ভারের জন্য প্লেয়ার এবং সর্বাধিক প্লেয়ারের সংখ্যা
  • অন্য কোনও গেম-সুনির্দিষ্ট তথ্য যা ক্লায়েন্টের সংযোগ স্থাপনের সিদ্ধান্ত নেওয়ার ক্ষেত্রে প্রভাব ফেলবে। গেমসের "সার্ভার ব্রাউজারগুলি" এবং তারা যে ধরণের তথ্য দেখায় সেগুলি সম্পর্কে ভাবুন।

আমি যা ভাবছিলাম ঠিক এটাই ছিল। সম্প্রচার হ'ল উপায়।
লোলামস

3

আপনি যখন আপনার লাইব্রেরিটি ছেড়ে যেতে চান না, আপনি কেবল নিষ্ঠুর শক্তি ব্যবহার করতে এবং সম্ভাব্য ঠিকানাগুলির প্রত্যেকটির সাথে সংযোগ স্থাপনের চেষ্টা করতে পারেন। বেশিরভাগ হোম ল্যানগুলি ক্লাস-সি নেটওয়ার্কগুলি (/ 24) যেখানে আইপি ঠিকানার প্রথম 24 বিট একই এবং শেষ 8 বিট পৃথক। সুতরাং আপনার কেবল 255 টি সম্ভাব্য আইপি ঠিকানা রয়েছে।

তবে তবুও, ইউডিপি সম্প্রচার করা পরিষ্কার বিকল্প হবে। 255.255.255.255 তে কেবল একটি ইউডিপি প্যাকেট প্রেরণ করুন এবং একই রাউটারের পিছনে থাকা সমস্ত ক্লায়েন্ট এটি গ্রহণ করবে। তারপরে তারা প্যাকেটের উত্স আইপি এবং উত্স পোর্টটিতে উত্তর প্রেরণ করতে পারে প্রেরককে তারা উপস্থিত রয়েছে তা অবহিত করতে।


2
দয়া করে দয়া করে নিষ্ঠুর-জোর করবেন না দয়া করে
ট্রেভর পাওয়েল

@ ট্রেভরপওয়েল ... কারণ ...?
ফিলিপ

2
কারণ এটি ভুল সমাধান। এটি বিশ্ববিদ্যালয়গুলিতে (যা ক্লাস-সি নেটওয়ার্কগুলি ব্যবহার করে না) বা ব্যবসায়গুলিতে (যা সাধারণত ক্লাস-সি নেটওয়ার্কগুলি ব্যবহার করে না) কাজ করবে না এবং আইটি কর্মীরা প্রতিটি খেলোয়াড়কে তৈরি করার কারণে বোঝা অপছন্দ করবে either ব্রুট ফোর্স তাদের নেটওয়ার্কের প্রতিটি আইপি ঠিকানায় বারবার 'রিফ্রেশ' বোতামে ক্লিক করার বার্তা প্রেরণের চেষ্টা করে। এটি সমস্যার একটি খারাপ সমাধান । কোনও গণিতের সার্ভার ছাড়াই সম্ভাব্য সমবয়সীদের সনাক্ত করার এই প্রশ্নটি ব্রডকাস্টের জন্য ঠিক কী। সম্প্রচার ব্যবহার করুন। এটি প্রতিটি উপায়ে আরও ভাল :)
ট্রেভর পাওয়েল

1

আপনি কটাক্ষপাত থাকতে পারে কে DNS- এসডি / ZeroConf / নির্মাণের জন্য Avahi / রিসিভ / mDNS । এটি প্রিন্টার, আইটিউনস ফোল্ডার ইত্যাদির জন্য অ্যাপল যে জিনিসগুলি ব্যবহার করে তা কিন্তু এটি অন্য কোথাও গৃহীত হয়েছে। অবাহী হ'ল ওপেনসোর্স সংস্করণ যা লিনাক্স ব্যবহার করে (এটি কেবল লিনাক্স কিনা তা নিশ্চিত নয়), পুরো জিনিসটি পোর্টেবল কিনা তা নিশ্চিত নয় (যদিও বেশিরভাগ প্ল্যাটফর্মের জন্য বাস্তবায়ন রয়েছে)।

সব বলার পরে, কেবল ইউডিপি সম্প্রচার করা সম্ভবত সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.