একাধিক প্রক্রিয়া শোনার সকেট ভাগ করার কোন উপায় আছে কি?


90

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

দুটি প্রক্রিয়া একই বন্দরটিতে একই সাথে আবদ্ধ হতে পারে না - ডিফল্টরূপে, যাইহোক।

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

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

এ জাতীয় বৈশিষ্ট্য কি বিদ্যমান?

সম্পাদনা: যারা জিজ্ঞাসা করছেন তাদের জন্য "থ্রেড কেন ব্যবহার করবেন না?" স্পষ্টতই থ্রেডগুলি একটি বিকল্প। তবে একক প্রক্রিয়াতে একাধিক থ্রেডের সাহায্যে সমস্ত বস্তু ভাগ করে নেওয়া যায় এবং অবজেক্টগুলি ভাগ না হয় বা একসাথে কেবল একটি থ্রেডের কাছে দৃশ্যমান হয়, বা একেবারে অপরিবর্তনীয়, এবং সর্বাধিক জনপ্রিয় ভাষা এবং রানটাইমসের এই জটিলতা পরিচালনার জন্য অন্তর্নির্মিত সহায়তার অভাব রয়েছে।

মুষ্টিমেয় অভিন্ন কর্মী প্রক্রিয়া শুরু করার মাধ্যমে আপনি একটি সমকালীন সিস্টেম পেয়ে যাবেন যেখানে ডিফল্ট কোনও ভাগ হয় না, একটি সঠিক এবং স্কেলযোগ্য বাস্তবায়ন তৈরি করা আরও সহজ করে তোলে।


4
আমি সম্মত, একাধিক প্রক্রিয়া একটি সঠিক এবং শক্তিশালী বাস্তবায়ন তৈরি করা আরও সহজ করে তুলতে পারে। স্কেলেবল, আমি নিশ্চিত নই, এটি আপনার সমস্যার ডোমেনের উপর নির্ভর করে।
মার্কআর

উত্তর:


92

আপনি লিনাক্স এবং এমনকি উইন্ডোজে দুটি (বা আরও) প্রক্রিয়াগুলির মধ্যে একটি সকেট ভাগ করতে পারেন।

লিনাক্সের অধীনে (বা পসিক্স টাইপ ওএস), fork()কাঁটাযুক্ত বাচ্চার সমস্ত পিতামাতার ফাইল বর্ণনাকারীর কপি থাকতে পারে। এটি যেটি বন্ধ করে না সেগুলি ভাগ করা অবিরত থাকবে এবং (উদাহরণস্বরূপ, টিসিপি শ্রবণকারী সকেট সহ) accept()ক্লায়েন্টদের জন্য নতুন সকেটে ব্যবহৃত হতে পারে । বেশিরভাগ ক্ষেত্রে অ্যাপাচি সহ কতগুলি সার্ভার কাজ করে।

উইন্ডোজে একই জিনিসটি মূলত সত্য, কোনও fork()সিস্টেম কল না থাকলে পিতামাতার প্রক্রিয়াটি CreateProcessশিশু প্রক্রিয়া তৈরি করতে (যা অবশ্যই একই নির্বাহযোগ্য ব্যবহার করতে পারে) তৈরি করার প্রয়োজন হবে এবং এটি উত্তরাধিকারসূত্রে হ্যান্ডেলটি পাস করতে হবে।

শ্রোতা সকেটকে উত্তরাধিকারসূত্রে হ্যান্ডেল তৈরি করা সম্পূর্ণরূপে তুচ্ছ কার্যকলাপ নয় তবে খুব জটিলও নয়। DuplicateHandle()একটি সদৃশ হ্যান্ডেল তৈরি করতে ব্যবহার করা প্রয়োজন (এখনও পিতামাতার প্রক্রিয়ায় রয়েছে), এতে উত্তরাধিকারসূত্রে পতাকা সেট থাকবে। তারপরে আপনি STARTUPINFOস্ট্রাকচারের সেই হ্যান্ডেলটি একটি হিসাবে ক্রিয়েটপ্রসেসের শিশু প্রক্রিয়াতে দিতে পারেন STDIN, OUTবা ERRহ্যান্ডেল (ধরে নিচ্ছেন যে আপনি এটি অন্য কোনও কিছুর জন্য ব্যবহার করতে চান না)।

সম্পাদনা:

এমডিএসএন গ্রন্থাগারটি পড়লে দেখা যাচ্ছে যে WSADuplicateSocketএটি করার আরও শক্তিশালী বা সঠিক প্রক্রিয়া; এটি এখনও অনানুষ্ঠানিক কারণ পিতামাতাদের / সন্তানের প্রক্রিয়াগুলি নিয়ে কাজ করা দরকার যা কিছু আইপিসি প্রক্রিয়া দ্বারা হ্যান্ডেলটির নকল করা দরকার (যদিও এটি ফাইল সিস্টেমের কোনও ফাইলের মতোই সহজ হতে পারে)

স্পষ্টকরণ:

ওপির মূল প্রশ্নের উত্তরে, না, একাধিক প্রক্রিয়া করতে পারে না bind(); শুধু মূল পিতা বা মাতা প্রক্রিয়া কল করবে bind(), listen()ইত্যাদি, সন্তানের প্রসেস মাত্র দ্বারা অনুরোধ প্রক্রিয়া হবে accept(), send(), recv()ইত্যাদি


4
একাধিক প্রক্রিয়া সকেট অপশননেম নির্দিষ্ট করে বাইন্ড করতে পারে eউপস অ্যাড্রেস সকেট বিকল্প।
অ্যারন ক্লোজন

তবে কী কথা? প্রক্রিয়াগুলি যাইহোক থ্রেডের চেয়ে বেশি ভারী ওজনযুক্ত।
আন্তন টিখি

7
প্রক্রিয়াগুলি থ্রেডগুলির চেয়ে বেশি ভারী ওজনযুক্ত, তবে তারা কেবল স্পষ্টভাবে ভাগ করে নেওয়ার জিনিসগুলি ভাগ করে নেয়, তাই কম সিঙ্ক্রোনাইজেশন প্রয়োজন যা প্রোগ্রামিংকে সহজ করে তোলে এবং কিছু ক্ষেত্রে এমনকি আরও কার্যকরও হতে পারে।
মার্কআর

11
তদুপরি, যদি কোনও শিশু প্রক্রিয়াটি কোনওভাবে ক্রাশ হয় বা ভেঙে যায় তবে পিতামাতাকে প্রভাবিত করার সম্ভাবনা কম থাকে।
মার্কআর

4
আরও লক্ষণীয় যে লিনাক্সে আপনি কাঁটাচামড়া () ব্যবহার না করেই অন্যান্য প্রোগ্রামগুলিতে সকেটগুলি "পাস" করতে পারেন এবং ইউনিক্স সকেটগুলি ব্যবহার করে কোনও পিতামাতার / সন্তানের সম্পর্ক নেই।
রাহেলি

35

বেশিরভাগ অন্যরা এই কাজ করার প্রযুক্তিগত কারণগুলি সরবরাহ করেছেন। এটি নিজের জন্য এটি প্রদর্শনের জন্য চালাতে পারেন এমন কয়েকটি অজগর কোড এখানে:

import socket
import os

def main():
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.bind(("127.0.0.1", 8888))
    serversocket.listen(0)

    # Child Process
    if os.fork() == 0:
        accept_conn("child", serversocket)

    accept_conn("parent", serversocket)

def accept_conn(message, s):
    while True:
        c, addr = s.accept()
        print 'Got connection from in %s' % message
        c.send('Thank you for your connecting to %s\n' % message)
        c.close()

if __name__ == "__main__":
    main()

মনে রাখবেন যে প্রকৃতপক্ষে দুটি প্রক্রিয়া আইডির শ্রবণ রয়েছে:

$ lsof -i :8888
COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Python  26972 avaitla    3u  IPv4 0xc26aa26de5a8fc6f      0t0  TCP localhost:ddi-tcp-1 (LISTEN)
Python  26973 avaitla    3u  IPv4 0xc26aa26de5a8fc6f      0t0  TCP localhost:ddi-tcp-1 (LISTEN)

এখানে চলমান টেলনেট এবং প্রোগ্রামের ফলাফল:

$ telnet 127.0.0.1 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Thank you for your connecting to parent
Connection closed by foreign host.
$ telnet 127.0.0.1 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Thank you for your connecting to child
Connection closed by foreign host.
$ telnet 127.0.0.1 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Thank you for your connecting to parent
Connection closed by foreign host.

$ python prefork.py 
Got connection from in parent
Got connection from in child
Got connection from in parent

4
সুতরাং একটি সংযোগের জন্য, পিতা-মাতা বা শিশু এটি পায়। তবে সংযোগটি কে পাওয়া যায় নির্দলীয়, তাই না?
হট.পেক্সএল

4
হ্যাঁ, আমি মনে করি এটি ওএস দ্বারা চালিত হওয়ার জন্য কোন প্রক্রিয়া নির্ধারিত হবে তার উপর নির্ভর করে।
অনিল ভাইটলা 20'15

14

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

দেখা:

AF_UNIX সকেট তৈরি করার জন্য:

উদাহরণস্বরূপ কোড:


13

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

এখানে একটি ভাল বিবরণ দেওয়া হয়েছে:

         Implementation of HTTP Auth Server Round-Robin and
                Memory Caching for NGINX Email Proxy

                            June 6, 2007
             Md. Mansoor Peerbhoy <mansoor@zimbra.com>

...

একটি এনজিআইএনএক্স কর্মী প্রক্রিয়া প্রবাহ

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

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

(দ্রষ্টব্য) এনজিআইএনএক্স একাধিক ইভেন্ট পোলিংয়ের যেকোন একটির ব্যবহারের জন্য কনফিগার করা যেতে পারে: আইও / ডেভপল / এপল / ইভেন্টপল / কেকিউ / পোল / আরটিসিগ / নির্বাচন

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

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

যদি ট্রিগার হওয়া ইভেন্টটি নতুন আগত সংযোগের সাথে সম্পর্কিত হয়, এনজিআইএনএক্স শ্রবণ সকেট থেকে সংযোগটি গ্রহণ করে। তারপরে, এটি ফাইলের বর্ণনাকারীর সাথে একটি প্রসঙ্গে ডেটা কাঠামো সংযুক্ত করে। এই প্রসঙ্গে সংযোগ সম্পর্কে তথ্য রয়েছে (পপ 3 / আইএমএপি / এসএমটিপি, ব্যবহারকারী এখনও প্রমাণীকৃত কিনা তা ইত্যাদি)। তারপরে, এই নবনির্মিত সকেটটিকে কর্মী প্রক্রিয়াটির জন্য ইভেন্ট বর্ণনাকারী সেটটিতে যুক্ত করা হয়েছে।

কর্মী এখন মিটেক্সকে ত্যাগ করেছেন (যার অর্থ অন্য শ্রমিকদের কাছে আগত কোনও ঘটনা আগেই চালিয়ে যেতে পারে), এবং পূর্ববর্তী সারিবদ্ধ প্রতিটি অনুরোধ প্রক্রিয়া শুরু করে। প্রতিটি অনুরোধ সিগন্যাল করা একটি ইভেন্টের সাথে মিলে যায়। সংকেতযুক্ত প্রতিটি সকেট বর্ণনাকারী থেকে কর্মী প্রক্রিয়া সেই প্রসঙ্গে বর্ণিত ডেটা কাঠামো পুনরুদ্ধার করে যা পূর্বে সেই বর্ণনাকারীর সাথে সম্পর্কিত ছিল এবং তারপরে সেই সংযোগের অবস্থার ভিত্তিতে ক্রিয়া সম্পাদন করে সম্পর্কিত কল ব্যাক ফাংশনগুলিকে কল করে। উদাহরণস্বরূপ, নতুন প্রতিষ্ঠিত আইএমএপ সংযোগের ক্ষেত্রে এনজিআইএনএক্স প্রথম যেটি করবে তা হ'ল
সংযুক্ত সকেটে স্ট্যান্ডার্ড আইএমএপ স্বাগত বার্তা লিখুন (* ওকে আইএমএপি 4 প্রস্তুত)।

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


11

এটি মূল প্রশ্নের সাথে কতটা প্রাসঙ্গিক তা নিশ্চিত নয়, তবে লিনাক্স কার্নেল ৩.৯-তে একটি প্যাচ রয়েছে যাতে একটি টিসিপি / ইউডিপি বৈশিষ্ট্য যুক্ত হয়: এসওএলসুএসপোর্ট সকেট বিকল্পের জন্য টিসিপি এবং ইউডিপি সমর্থন; নতুন সকেট বিকল্পটি একই হোস্টের একাধিক সকেটকে একই বন্দরে বাঁধতে দেয় এবং মাল্টিকোর সিস্টেমের শীর্ষে চলমান মাল্টিথ্রেডেড নেটওয়ার্ক সার্ভার অ্যাপ্লিকেশনগুলির কার্যকারিতা উন্নত করার উদ্দেশ্যে। রেফারেন্স লিঙ্কে উল্লিখিত লিনাক্স কার্নেল ৩.৯-এ এলডাব্লুএন লিঙ্কে এলডাব্লুউন SO_REUSEPORT আরও তথ্য পাওয়া যাবে :

SO_REUSEPORT বিকল্পটি মানহীন, তবে অন্যান্য অনেক ইউনিক্স সিস্টেমে অনুরূপ আকারে উপলব্ধ (উল্লেখযোগ্যভাবে, BSDs, যেখানে ধারণাটির উদ্ভব হয়েছিল)। কাঁটাচলা বিন্যাস ব্যবহার না করে মাল্টিকোর সিস্টেমে চলমান নেটওয়ার্ক অ্যাপ্লিকেশনগুলির মধ্যে সর্বাধিক কার্যকারিতা নিঃসরণের জন্য এটি একটি কার্যকর বিকল্প প্রস্তাব বলে মনে হচ্ছে।


এলডাব্লুএন নিবন্ধ থেকে এটি প্রায় দেখে মনে হচ্ছে SO_REUSEPORTএকটি থ্রেড পুল তৈরি করে, যেখানে প্রতিটি সকেট আলাদা থ্রেডে থাকে তবে গ্রুপে কেবল একটি সকেট সম্পাদন করে accept। আপনি কি গ্রুপের সমস্ত সকেট প্রতিটি ডেটার একটি অনুলিপি নিশ্চিত করতে পারবেন?
jww

4

লিনাক্স ৩.৯ দিয়ে শুরু করে আপনি একটি সকেটে SO_REUSEPORT সেট করতে পারেন এবং তারপরে একাধিক অ-সম্পর্কিত প্রক্রিয়া সেই সকেটে ভাগ করে নিতে পারেন। এটি প্রেফার্ক স্কিমের চেয়ে সহজ, সিগন্যাল সমস্যা আর নেই, শিশু প্রসেসে fd ফাঁস ইত্যাদি

লিনাক্স ৩.৯ সকেট সার্ভার লেখার নতুন পদ্ধতি চালু করেছে

SO_REUSEPORT সকেট বিকল্প


3

একটি একক টাস্ক থাকুন যার একমাত্র কাজ আসন্ন সংযোগগুলি শোনার। কোনও সংযোগ পাওয়া গেলে, এটি সংযোগটি গ্রহণ করে - এটি একটি পৃথক সকেট বর্ণনাকারী তৈরি করে। গ্রহণযোগ্য সকেটটি আপনার উপলব্ধ কর্মীদের কোনও একটিতে দেওয়া হয় এবং প্রধান কাজটি শোনার পথে ফিরে যায়।

s = socket();
bind(s);
listen(s);
while (1) {
  s2 = accept(s);
  send_to_worker(s2);
}

সকেট কীভাবে কোনও শ্রমিকের কাছে দেওয়া হয়? মনে রাখবেন যে ধারণাটি কোনও শ্রমিক একটি পৃথক প্রক্রিয়া।
ড্যানিয়েল আর্উইকার

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

3

উইন্ডোজ (এবং লিনাক্স) এর অধীনে একটি প্রক্রিয়াটির জন্য সকেট খোলা সম্ভব হয় এবং তারপরে সেই সকেটকে অন্য প্রক্রিয়াতে এমনভাবে পাস করা সম্ভব হয় যে দ্বিতীয় প্রক্রিয়াটি পরে সেই সকেটটি ব্যবহার করতে পারে (এবং এটি পরিবর্তন করতে চাইলে এটি কীভাবে প্রবর্তন করতে পারে) ।

গুরুত্বপূর্ণ ফাংশন কলটি হ'ল ডাব্লুএসএডুপুলিকেটসকেট ()।

এটি বিদ্যমান সকেট সম্পর্কিত তথ্য সহ একটি কাঠামোকে পপুলেট করে। তারপরে এই কাঠামোটি আপনার পছন্দসই আইপিসি মেকানিজমের মাধ্যমে অন্য একটি বিদ্যমান প্রক্রিয়াতে উত্তীর্ণ হয়ে গেছে (নোট আমি বিদ্যমান বলছি - আপনি যখন ডাব্লুএসএডুপ্লিকেটসকেট () কল করেন তখন আপনাকে অবশ্যই লক্ষ্য প্রক্রিয়াটি নির্দেশ করতে হবে যা নির্গত তথ্য গ্রহণ করবে)।

প্রাপ্তির প্রক্রিয়াটি তথ্যের এই কাঠামোটি পেরিয়ে ডাব্লুএসএএসকেট () কে কল করতে পারে এবং অন্তর্নিহিত সকেটে একটি হ্যান্ডেল গ্রহণ করতে পারে।

উভয় প্রক্রিয়া এখন একই অন্তর্নিহিত সকেটের একটি হ্যান্ডেল ধরেছে।


2

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

বিকল্পভাবে আপনি একই সকেটে একাধিক প্রক্রিয়া আবদ্ধ এবং শ্রবণ করতে পারেন।

TcpListener tcpServer = new TcpListener(IPAddress.Loopback, 10090);
tcpServer.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
tcpServer.Start();

while (true)
{
    TcpClient client = tcpServer.AcceptTcpClient();
    Console.WriteLine("TCP client accepted from " + client.Client.RemoteEndPoint + ".");
}

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


2

আপনি যদি HTTP ব্যবহার করে থাকেন তবে উইন্ডোজটিতে অন্য একটি পদ্ধতি (যা অনেক জটিল বিবরণ এড়ায়) হ'ল HTTP.SYS ব্যবহার করা । এটি একাধিক প্রক্রিয়াগুলিকে একই বন্দরে বিভিন্ন ইউআরএল শুনতে দেয় allows সার্ভার 2003/2008 / ভিস্তা / 7 এ এইভাবে আইআইএস কাজ করে, তাই আপনি এটির সাথে পোর্টগুলি ভাগ করতে পারেন। (এক্সপি এসপি 2 এ HTTP.SYS সমর্থিত তবে আইআইএস 5.1 এটি ব্যবহার করে না))

অন্যান্য উচ্চ স্তরের এপিআই (ডাব্লুসিএফ সহ) HTTP.SYS ব্যবহার করে।

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