ঠিক আছে, সবার আগে, আপনার যদি কিছু থাকে এবং এটি কাজ করে তবে সাধারণত এটি ঠিক রেখে দেওয়া ভাল। কেন ভাঙা হয়নি তা স্থির করবেন?
তবে যদি আপনার সমস্যা হয়, এবং আপনার নেটওয়ার্কিং কোডটি সত্যই আবার লিখতে চান তবে আমার মনে হয় আপনার চারটি প্রধান পছন্দ রয়েছে:
- মাল্টিথ্রেডেড ব্লকিং কোড (আপনি এখনই কী করছেন)
- স্তর-ট্রিগারযুক্ত বিজ্ঞপ্তি সহ অ-ব্লক করা সকেট
- প্রস্তুতি পরিবর্তনের বিজ্ঞপ্তি সহ অ-ব্লক করা সকেট
- অ্যাসিঙ্ক্রোনাস সকেট
ক্লায়েন্ট এবং সার্ভারে প্রচুর মাল্টিপ্লেয়ার (পিয়ার-টু পিয়ার থেকে শুরু করে বহু মাল্টিপ্লেয়ার) লিখে আমি মনে করতে চাই যে বিকল্পটি 2 গেমের সার্ভার এবং ক্লায়েন্ট অংশগুলির জন্য বেশ ভাল পারফরম্যান্স সহ কমপক্ষে জটিলতার দিকে নিয়ে যায়। দ্বিতীয়টি হিসাবে, আমি বিকল্প 4 নিয়ে যাব, তবে এর জন্য আপনাকে সাধারণত আপনার পুরো প্রোগ্রামটি নিয়ে নতুন করে চিন্তা করতে হবে এবং আমি বেশিরভাগই এটি ক্লায়েন্টদের জন্য নয় সার্ভারের জন্য দরকারী বলে মনে করি।
বিশেষত, আমি একটি বহুবিবাহিত পরিবেশে সকেটগুলি ব্লক করার বিরুদ্ধে পরামর্শ দিতে চাই, কারণ এটি করার ফলে সাধারণত লকিং এবং অন্যান্য সিঙ্ক্রোনাইজেশন বৈশিষ্ট্য দেখা দেয় যা কেবল কোডের জটিলতা বৃদ্ধি করে না, তবে এর কার্যকারিতা হ্রাস করতে পারে কারণ কিছু থ্রেড অপেক্ষা করে অন্যান্য.
তবে সর্বোপরি, বেশিরভাগ সকেট বাস্তবায়ন (এবং সর্বাধিক I / O বাস্তবায়ন) সর্বনিম্ন স্তরে অবরুদ্ধ হয়। অবরুদ্ধ অপারেশনগুলি কেবল তুচ্ছ প্রোগ্রামগুলির উন্নয়নকে সহজতর করার জন্য সরবরাহ করা হয়। যখন কোনও সকেট অবরুদ্ধ করা হয়, তখন সেই থ্রেডের সিপিইউ সম্পূর্ণ নিষ্ক্রিয় থাকে, তবে ইতিমধ্যে একটি অ-ব্লকিং টাস্কের উপরে ব্লকিং অ্যাবস্ট্রাকশনটির উপরে কেন একটি নন-ব্লকিং অ্যাবস্ট্রাকশন তৈরি করবেন?
আপনি যদি এটি ব্যবহার না করে থাকেন তবে অ-ব্লকিং সকেট প্রোগ্রামিংটি কিছুটা দু: খজনক, তবে এটি প্রমাণিত হয়েছে যে এটি বেশ সহজ এবং যদি আপনি ইতিমধ্যে ইনপুট পোলিং করছেন, আপনার ইতিমধ্যে অবরুদ্ধকরণ সকেট করার মানসিকতা রয়েছে।
প্রথমটি যা আপনি করতে চান তা হ'ল সকেটটি অ-ব্লক করাতে সেট করা। আপনি এটা দিয়ে fcntl()
।
এর পর, আগে আপনি কি send()
, recv()
, sendto()
, recvfrom()
, accept()
( connect()
বা অন্যান্য কল থ্রেড ব্লক করতে পারে, আপনি কল একটু ভিন্ন) select()
সকেট উপর। select()
পরবর্তী পঠন বা লেখার ক্রিয়াকলাপটি ব্লক না করে সকেটে সঞ্চালন করা যায় কিনা তা আপনাকে জানায়। যদি এটি হয় তবে আপনি নিজের পছন্দ মতো অপারেশনটি নিরাপদে করতে পারেন, এবং সকেটটি ব্লক করবে না।
এটি একটি গেমের অন্তর্ভুক্ত করা বেশ সহজ। আপনার যদি ইতিমধ্যে একটি গেম লুপ থাকে তবে উদাহরণস্বরূপ:
while game_is_running do
poll_input()
update_world()
do_sounds()
draw_world()
end
আপনি এটি দেখতে এটি পরিবর্তন করতে পারে:
while game_is_running do
poll_input()
read_network()
update_world()
do_sounds()
write_network()
draw_world()
end
কোথায়
function read_network()
while select(socket, READ) do
game.net_input.enqueue(recv(socket))
end
end
এবং
function write_network()
while not game.net_output.empty and select(socket, WRITE) do
send(socket, game.net_output.dequeue())
end
end
সম্পদের দিক থেকে, আমি মনে করি যে প্রত্যেকেরই নিজের বইয়ের দোকানগুলিতে অবশ্যই থাকতে হবে, যদিও এটি তাদের একমাত্র বই , এটি প্রয়াত রিচার্ড স্টিভেন্সের " ইউনিক্স নেটওয়ার্ক প্রোগ্রামিং, ভোল্ট ১ " is আপনি উইন্ডোজ বা অন্যান্য ওএস বা ভাষার সকেট প্রোগ্রামিং করে তা বিবেচনা করে না। আপনি এই বইটি না পড়া পর্যন্ত আপনি সকেটগুলি বোঝেন বলে মনে করবেন না।
আরেকটি সংস্থান যেখানে আপনি একাধিক সকেট প্রোগ্রামিং (সার্ভার প্রোগ্রামিংয়ের ক্ষেত্রে বেশিরভাগ প্রাসঙ্গিক) এর ক্ষেত্রে উপলব্ধ সমাধানগুলির একটি সাধারণ ওভারভিউ খুঁজে পেতে পারেন এটি এই পৃষ্ঠা ।