লিনাক্স নাম সকেট হাও


38

আমি জানি যে লিনাক্সে নামযুক্ত সকেট এবং নামযুক্ত পাইপ (ফিফো) রয়েছে।

ইন ls -l, তারা নীচের মত দেখতে হবে: (আমি ফাইলের নাম পরিবর্তন করেছি, প্রদর্শনের জন্য।)

prw-r--r-- 1 root root 0 Nov  8 16:31 /tmp/fifo
srwxrwxrwx 1 root root 0 Nov  8 15:54 /tmp/socket

এখন, একটি নামী পাইপ ব্যবহার করে তৈরি করা যেতে পারে mkfifo। একটি নামী সকেট তৈরি করার জন্য কোনও আদেশ আছে?

শেষ বিকল্পটি হ'ল একটি সি প্রোগ্রাম লিখতে হবে, যেটি mknod ফাংশনটি কল করবে, তবে জানতে চেয়েছিল, যদি ইতিমধ্যে এর জন্য কোনও কমান্ড রয়েছে।

আমি যা চেষ্টা করেছি:
আমি এমকেএনড ও এমকিফাইফোর কোনও বিকল্প অনুসন্ধান করার চেষ্টা করেছি, তবে একটিও খুঁজে পাইনি।

দ্রষ্টব্য: আমি ইথারনেট / নেটওয়ার্কের মাধ্যমে সার্ভার-ক্লায়েন্ট মডেল সম্পর্কে আলোচনা করছি না। নামকৃত সকেট ফাইল একই সিস্টেমে 2 টি প্রক্রিয়া ব্যবহার করবে।


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

উত্তর:


24

একটি ইউনিক্স / লিনাক্স সকেট ফাইল মূলত একটি দ্বিমুখী ফিফো। যেহেতু সকেটগুলি মূলত নেটওয়ার্ক যোগাযোগগুলি পরিচালনা করার উপায় হিসাবে তৈরি করা হয়েছিল, তাই এটি send()এবং recv()সিস্টেম কলগুলি ব্যবহার করে সেগুলি চালিত করা সম্ভব । যাইহোক, এর ইউনিক্স আত্মা, এছাড়াও আপনি ব্যবহার করতে পারেন "সবকিছু একটি ফাইল" write()এবং read()। আপনার নামযুক্ত সকেট ব্যবহার socketpair()বা socket()তৈরি করতে হবে। সিতে সকেট ব্যবহারের জন্য একটি টিউটোরিয়ালটি এখানে পাওয়া যাবে: ইউনিক্স আইপিসিতে বিজের গাইড: ইউনিক্স সকেট

socatযখন আপনি একটি "বাস্তব" কর্মসূচির লেখা ছাড়া সকেট নিয়ে খেলতে চাই কমান্ড লাইন ইউটিলিটি দরকারী। এটি অনুরূপ netcatএবং বিভিন্ন নেটওয়ার্কিং এবং ফাইল ইন্টারফেসের মধ্যে অ্যাডাপ্টার হিসাবে কাজ করে।

লিঙ্ক:


1
সকেটপায়ার () বা সকেট () একটি নামবিহীন সকেট তৈরি করে, যা কেবল সি প্রোগ্রামের মধ্যে থেকেই কার্যকর হবে।
আনিসনে

এটি চেক করা আকর্ষণীয় হবে, যদি এটি ব্যবহার করে কোনও নামী সকেট তৈরি করা সম্ভব হয় socat। সম্ভবত, একটি শিরোনামহীন সকেট তৈরি করুন, লোকালহোস্টে আবদ্ধ করুন: কিছু_পোর্ট & তারপরে সেই পোর্টের সাথে সকেট ব্যবহার করবেন?
আনিসনে

3
socatইউনিক্স-লিস্টেন কমান্ডের সাহায্যে নামযুক্ত সকেট তৈরি করা সম্ভব , এই HTML টি ম্যানুয়ালটি দেখুন man socatবা দেখুন
জোয়াকিম নোহলগার্ড

1
আমি এই দ্রুত ও মলিন কমান্ড চেষ্টা এবং এটি একটি সকেট ফাইল তৈরি f1: socat UNIX-LISTEN:f1 LISTEN:f2
টোটার

1
এটি সকেট ওয়েবসাইটের বিবরণে সমাহিত করা হয়েছে, তবে এটি সহায়ক হলে, দুটি একমুখী নামক পাইপ (ফিফোস) এর একক দ্বি-দিকনির্দেশক ইউনিট হিসাবে চিকিত্সার জন্য একটি বাক্য গঠন যা ইউনিক্স বা টিসিপি সকেটের মতো অন্যান্য দ্বিপাক্ষিক সংস্থাগুলিতে ব্রিজ করা যায়। আপনি !!বামদিকে পাইপযুক্ত নামের পাইপ এবং ডানদিকে পঠন নামক পাইপ সহ, (সোকাট 1.x) বা %(সোকাট 2.x) সহ নামযুক্ত পাইপগুলিতে যোগদান করুন । উদাহরণস্বরূপsocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
ইভান এক্স

17

পাইথনে দ্রুত সকেট তৈরি করুন:

~]# python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/somesocket')"
~]# ll /tmp/somesocket 
srwxr-xr-x. 1 root root 0 Mar  3 19:30 /tmp/somesocket

বা একটি ক্ষুদ্র সি প্রোগ্রাম সহ , উদাহরণস্বরূপ, নিম্নলিখিতটি সংরক্ষণ করুন create-a-socket.c:

#include <fcntl.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    // The following line expects the socket path to be first argument
    char * mysocketpath = argv[1];
    // Alternatively, you could comment that and set it statically:
    //char * mysocketpath = "/tmp/mysock";
    struct sockaddr_un namesock;
    int fd;
    namesock.sun_family = AF_UNIX;
    strncpy(namesock.sun_path, (char *)mysocketpath, sizeof(namesock.sun_path));
    fd = socket(AF_UNIX, SOCK_DGRAM, 0);
    bind(fd, (struct sockaddr *) &namesock, sizeof(struct sockaddr_un));
    close(fd);
    return 0;
}

তারপরে জিসিসি ইনস্টল করুন, এটি সংকলন করুন এবং তা-দা:

~]# gcc -o create-a-socket create-a-socket.c
~]# ./create-a-socket mysock
~]# ll mysock
srwxr-xr-x. 1 root root 0 Mar  3 17:45 mysock

1

সকেট তৈরি করার জন্য কোনও কমন্ড লাইন সরঞ্জাম নেই যেহেতু সকেট সর্বদা একটি সার্ভারের সাথে সংযুক্ত থাকে যা সেই সকেটে প্রেরিত অনুরোধগুলি পরিচালনা করে।

সুতরাং আপনাকে একটি সার্ভার লিখতে হবে এবং এটি সকেট তৈরি করতে দিন। এখানে একটি টিউটোরিয়াল


এটি এখনও একটি নামবিহীন সকেট হবে। আমি একটি সকেট তৈরি করতে চাই, যা দ্বি নির্দেশমূলক ফিফো হিসাবে 2 অন্যান্য প্রক্রিয়া দ্বারা ব্যবহৃত হবে।
আনিসনে

আমার উত্তরে লিঙ্কটি পরীক্ষা করুন। এটি কীভাবে bind()সংযোগ স্থাপন করতে কনফিগার করবেন তা দেখায়"/home/beej/mysocket"
অ্যারোন ডিগুল্লা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.