| gensio(5) | File Formats Manual | gensio(5) |
نام (NAME)
gensio - نحوه تعیین و پیکربندی یک gensio
خلاصه دستور (SYNOPSIS)
<type>[(options)][,gensio|terminaloptions]
توضیحات (DESCRIPTION)
gensio مخفف GENeral Stream Input Output (ورودی/خروجی جریانی عمومی) است. این کتابخانه یک انتزاع (abstraction) برای انواع I/O جریانی فراهم میکند و حتی برخی I/Oهای بستهای (مانند UDP) را به شکل I/O جریانی درمیآورد. بهویژه، gensio ایجاد اتصالات رمزگذاریشده و احرازهویتشده را آسان میسازد.
کتابخانه gensio یک اتصال (gensio) را با استفاده از یک قالب رشتهای (string format) مشخص میکند. این ساختار شامل یک نوع gensio و گزینههای اختیاری درون پرانتز است. برای یک gensio پایانی یا انتهایی (terminal gensio - گزینهای که در پایین پشته قرار دارد)، میتواند گزینههای انتهایی (terminaloptions) بیشتری را که با کاما جدا شدهاند دریافت کند. برای gensioهای فیلتر (آنهایی که در پایین پشته نیستند)، باید یک gensio دیگر پس از کاما مشخص شود. برای نمونه:
- serialdev,/dev/ttyS0
یک gensio پورت سریال را مشخص میکند. یا:
- tcp(readbuf=100),localhost,4000
یک اتصال TCP با بافر خواندن ۱۰۰ بایتی را برای اتصال به پورت 4000 روی localhost مشخص میکند. یا:
- telnet,tcp,localhost,4000
یک فیلتر telnet را روی یک اتصال TCP مشخص میکند.
توجه داشته باشید که گزینههای معمولی همیشه درون پرانتز قرار میگیرند. تنها terminaloptions پس از کاما روی یک terminal gensio میآیند.
هنگام تعیین یک gensio، میتوانید از نقلقولها (تکی یا جفتی) برای حذف معنای خاص برخی نویسهها استفاده کنید تا بتوانید در گزینهها و موارد مشابه کاما داشته باشید. همچنین میتوان آنها را با «\» اسکیپ کرد. برای نمونه، اگر در حال تعیین یک laddr در آدرس sctp هستید، باید این کار را انجام دهید. آدرس زیر:
- sctp(laddr=localhost,4001),localhost,3023
به شکست منجر خواهد شد زیرا کد تجزیه گزینه، رشته را در محل کاماها جدا میکند. در عوض، بنویسید:
- sctp(laddr="localhost,4001"),localhost,3023
و این کار خواهد کرد.
Gensioهای پذیرنده (Accepter gensios)، یعنی gensioهایی که برای پذیرش اتصالات استفاده میشوند، در مقابل gensioهای متصلشونده (connecting gensios)، به همان شیوه مشخص میشوند. هر نوع منفرد میتواند متفاوت باشد و برخی gensioها فقط اتصالدهنده هستند. گزینهها میتوانند بین gensioهای پذیرنده و متصلشونده از همان نوع تفاوت داشته باشند. برای نمونه، یک TCP gensio پذیرنده نیازی به داشتن hostname ندارد، اما نوع متصلشونده به آن نیاز دارد.
هنگامی که یک gensio پذیرنده اتصالی دریافت میکند، یک gensio پذیرفتهشده (accepted gensio) ایجاد خواهد کرد. این عمدتاً شبیه به یک gensio متصلشونده کار میکند، به جز اینکه برخی توابع ممکن است محدود باشند. ممکن است نتوانید یک gensio پذیرفتهشده را بسته و سپس دوباره باز کنید.
کتابخانه gensio دارای مفهوم کلاینت و سرور است. gensioهای پذیرفتهشده عموماً سرور در نظر گرفته میشوند. gensioهای متصلشونده عموماً کلاینت در نظر گرفته میشوند. برخی gensioها ممکن است اجازه دهند این رفتار بازنویسی و لغو شود.
یک gensio ممکن است قابل اعتماد (reliable) باشد یا نباشد. یک gensio قابل اعتماد تمامی دادهها را به ترتیب و با اطمینان تحویل میدهد، مانند TCP. یک gensio غیرقابل اعتماد ممکن است دادهها را از دست بدهد یا بدون ترتیب تحویل دهد، مانند UDP. این مورد را میتوان با تابع gensio_is_reliable() استعلام کرد.
یک gensio ممکن است بستهای (packet) باشد یا نباشد. یک gensio بستهای عملیات نوشتن و خواندن را دقیقاً تطبیق میدهد. بنابراین اگر ۱۵ بایت در یک سمت بنویسید، یک خواندن ۱۵ بایتی برای آن داده در سمت دیگر ظاهر خواهد شد. یک gensio غیربستهای مرزهای نوشتن را رعایت نمیکند؛ آن نوشتن ۱۵ بایتی ممکن است منجر به چندین خواندن شود یا با نوشتن دیگری ترکیب شده و به بیش از ۱۵ بایت تبدیل شود. I/O بستهای برای عملکرد صحیح نیازمند استفاده دقیق است. اگر gensio فضایی برای بسته دیگری نداشته باشد، نوشتن موفق خواهد بود اما ۰ بایت مینویسد. در غیر این صورت اگر بزرگتر از اندازه بسته بنویسید، تنها به تعداد بایتهایی که در یک بسته جا میشود دریافت کرده و داده کوتاه (truncate) خواهد شد. این در صورتی مفید است که بخواهید روی یک رابط بستهای جریان داده برقرار کنید، اما اگر واقعاً بسته میخواهید باید مطمئن شوید که همه اندازهها به درستی تنظیم شدهاند. به ویژه، باید حداکثر اندازه خواندن و نوشتن را روی یک مقدار یکسان تنظیم کنید. باید در هنگام نوشتن بررسی کنید که آیا همه دادهها نوشته شدهاند یا خیر. در صورت تمایل میتوانید مدیریت خواندن جزئی (partial read) را انجام دهید، اما باقیمانده بسته را فقط در خواندن دوم و موارد پس از آن دریافت خواهید کرد.
یک gensio ممکن است پیاممحور (message oriented) باشد. این پیادهسازی از SCTP اقتباس شده است (هرچند در حال حاضر روی لینوکس به طور کامل پشتیبانی نمیشود). اساساً به این معنی است که میتوانید صراحتاً هنگام ارسال داده مرزهای پیام را علامتگذاری کنید، و آن علامت صریح در سمت خواندن تنظیم خواهد شد. شما این کار را با افزودن auxdata با مقدار "eom" در هنگام نوشتن انجام میدهید؛ پایان آن نوشتن به عنوان پایان پیام فرض میشود. اگر نوشتن تمام دادهها را نپذیرد، "eom" نادیده گرفته میشود و باید دادههای باقیمانده را دوباره با تنظیم "eom" بنویسید. همچنین میتوانید نوشتن جزئی پیامها را انجام دهید و "eom" را در انتها تنظیم کنید. در سمت دریافت، وقتی انتهای یک پیام تحویل داده شود، "eom" تنظیم خواهد شد. دادههای تحویل داده شده در کالبک دریافت، تنها دادههای مربوط به آن پیام خواهند بود. اگر کاربر تمام دادهها را نپذیرد، دادههای باقیمانده در پیام دوباره با تنظیم "eom" به کاربر ارائه میشوند.
گزینهها بین gensioهای مختلف بسیار متغیر هستند. هر نوع gensio در یک بخش جداگانه پوشش داده خواهد شد. همچنین توجه داشته باشید که انواع gensio میتوانند به صورت پویا توسط کاربر اضافه شوند، بنابراین ممکن است gensioهایی در دسترس باشند که در اینجا شرح داده نشدهاند.
مگر در مواردی که خلاف آن ذکر شده باشد، هر gensio گزینه زیر را میپذیرد:
- readbuf=<n>
- گزینهای برای تعیین اندازه بافر خواندن.
پیشفرضها (DEFAULTS)
هر گزینه مربوط به یک gensio (از جمله گزینههای serialdev و ipmisol)، مگر اینکه خلاف آن ذکر شده باشد، به عنوان یک پیشفرض برای gensioها در دسترس است. میتوانید از gensio_set_default() برای تنظیم مقدار پیشفرض استفادهشده توسط همه gensioهایی که پس از آن نقطه تخصیص مییابند استفاده کنید. اگر کلاس (class) را روی NULL بگذارید، پیشفرض پایه تنظیم میشود که بر همه gensioها تأثیر میگذارد مگر اینکه دارای بازنویسی باشند. اگر کلاس را تنظیم کنید، فقط بر gensioهای دارای آن نام کلاس تأثیر خواهد گذاشت.
در مورد برخی پیشفرضها بسیار مراقب باشید. برای مثال تنظیم پیشفرض "mode" میتواند واقعاً اوضاع را به هم بریزد.
برای پیشفرضهای رشتهای، تنظیم مقدار پیشفرض روی NULL باعث میشود که gensio از پیشفرض پشتیبان خود استفاده کند.
جریانها و کانالها (STREAMS AND CHANNELS)
برخی gensioها از مفهوم جریان (stream) و/یا کانال (channel) پشتیبانی میکنند.
یک جریان به عنوان بخشی از جریان داده عادی یک gensio تحویل داده میشود. با جریان "default" به طور معمول رفتار خواهد شد. سایر جریانها دارای "stream=<x>" در auxdata خواهند بود تا مشخص شود روی کدام جریان باید نوشته شود یا از کدام جریان خوانده شده است. جریانها را نمیتوان به صورت جداگانه کنترل جریان (flow control) کرد.
یک کانال جریانی از دادهها مانند یک stream است، اما میتوان آن را به طور جداگانه کنترل جریان کرد. کانال به عنوان یک gensio جدید در کالبک GENSIO_EVENT_NEW_CHANNEL ظاهر میشود. میتوانید با gensio_alloc_channel() یک کانال ایجاد کرده و سپس با gensio_open() آن را باز کنید. پس از باز شدن، کانال مانند یک gensio عادی کار میکند. اگر کانال اصلی را برای یک gensio ببندید، سایر کانالها باز خواهند ماند؛ منابع مربوط به کانال اصلی تا زمان بسته شدن همه کانالها حفظ خواهند شد.
برای اطلاعات بیشتر در مورد جریانها و کانالها به توضیحات مربوط به هر gensio مراجعه کنید.
رمزنگاری کلید عمومی (PUBLIC KEY CRYPTOGRAPHY)
Gensioهای ssl و certauth از رمزنگاری کلید عمومی استفاده میکنند. این بخش نمای کلی کوتاهی از نحوه کارکرد آن ارائه میدهد. اگر قبلاً با این مفاهیم آشنایی دارید، میتوانید با خیال راحت این بخش را نادیده بگیرید.
رمزنگاری کلید عمومی برای احراز هویت و رمزگذاری اطلاعات در آغاز یک نشست (session) استفاده میشود. این یک عملیات نسبتاً سنگین است و عموماً برای رمزگذاری اطلاعات پس از شروع نشست استفاده نمیشود.
در رمزنگاری کلید عمومی، سه مؤلفه اساسی وجود دارد: یک کلید خصوصی (private key)، یک گواهی یا کلید عمومی (certificate / public key)، و یک مرجع صدور گواهی (CA).
کلید خصوصی کاملاً خصوصی است. شما حتی کلید خصوصی خود را برای امضای گواهی به مرجع صدور گواهی ارسال نمیکنید. آن را خصوصی و غیرقابل خواندن برای دیگران نگه دارید. از آن محافظت کنید؛ اگر فاش شود گواهی شما بیفایده خواهد شد و هر کسی میتواند خود را به جای شما جا بزند.
گواهی همان کلید عمومی است و از نظر ریاضی با یک کلید خصوصی منفرد مرتبط است. این کلید عمومی است و هر کسی میتواند با درخواست از شما برای امضای برخی دادهها، بررسی کند که آیا کلید خصوصی را در اختیار دارید یا خیر. دادههای موجود در گواهی (مانند Common Name) بخشی از گواهی هستند. اگر آن دادهها دستکاری شوند، اعتبارسنجی گواهی با شکست مواجه خواهد شد.
مرجع CA عموماً یک شخص ثالث مورد اعتماد است که شما را اعتبارسنجی کرده و گواهی شما را (عموماً در ازای هزینه) امضا میکند. مراجع CA گواهیهای عمومی خود را صادر میکنند که شناختهشده بوده و عموماً روی سیستم شما در دسترس هستند. گواهیهای CA برای اثبات معتبر بودن گواهی شما استفاده میشوند.
امضا کردن (SIGNING)
فرایند امضا قبلاً ذکر شد، اما تشریح نشد. اساساً، شما از کلید خصوصی خود برای تولید مقداری بر روی دادههای مشخص استفاده میکنید که ثابت میکند کلید خصوصی را در اختیار دارید. از گواهی برای اعتبارسنجی ریاضی امضا استفاده میشود.
معمولاً دو کار با این انجام میشود:
در تبادل کلید عمومی، نهادی که مایل به احراز هویت است یک گواهی ارسال میکند. نهاد مجوزدهنده درون CA خود به دنبال گواهیای میگردد که گواهی ارسالشده را امضا کرده باشد. اگر نهاد مجوزدهنده گواهیای پیدا کند که بتواند برای اعتبارسنجی گواهی ارسالشده استفاده شود، گواهی ارسالشده معتبر است.
پس از آن، نهاد مجوزدهنده دادههایی عموماً تصادفی را به نهاد دیگر ارسال میکند. نهاد دیگر آن دادهها (و شاید برخی دادههای مهم دیگر را که میخواهد مطمئن شود در حین انتقال تغییر نیافتهاند) گرفته و امضا میکند. سپس امضا را به نهاد مجوزدهنده بازمیگرداند. نهاد مجوزدهنده میتواند از دادهها و امضا برای اعتبارسنجی اینکه نهاد فرستنده کلید خصوصی مرتبط با گواهی را دارد استفاده کند.
این اساساً نحوه کار https است. توجه داشته باشید که این کلاینت وب (web client) است که سرور وب (web server) را احراز هویت میکند، نه برعکس. این ثابت میکند که شما به همان نهادی که مد نظر دارید متصل میشوید. احراز هویت یک کلاینت وب برای سرور وب عموماً از طریق سازوکار متفاوتی انجام میشود (هرچند SSL/TLS مورد استفاده توسط ssl gensio روشی برای انجام آن دارد، اما معمولاً برای این منظور استفاده نمیشود).
در سناریوی سرور وب، دادههای درون گواهی (به ویژه Common Name و Subject Alternate Name) باید با نام صفحه وبی که به آن متصل میشوید مطابقت داشته باشد. Gensioهای ssl و certauth این احراز هویت را انجام نمیدهند؛ این کار در صورت لزوم بر عهده کاربر است.
رمزگذاری (ENCRYPTING)
از گواهی میتوان برای رمزگذاری دادههایی استفاده کرد که فقط با کلید خصوصی قابل رمزگشایی هستند. هنگام برقراری یک اتصال رمزگذاریشده، این سازوکار معمولاً برای انتقال یک کلید رمزنگاری متقارن از یک نهاد به نهاد دیگر (نهاد مجوزدهنده به نهاد درخواستکننده در مورد بالا) استفاده میشود. شما میتوانید تمام دادهها را با کلید عمومی رمزگذاری کنید، اما این کار بسیار سنگین است و در مثال بالا نیازمند گواهیها و کلیدهای خصوصی در هر دو طرف است.
گواهیهای خودامضا (SELF-SIGNED CERTIFICATES)
امکان ایجاد گواهیای وجود دارد که بتواند به عنوان مرجع صدور گواهی خود عمل کند. این روش کارکرد ssh است. شما یک کلید عمومی و خصوصی ایجاد میکنید. کلید عمومی را در مسیر .ssh/authorized_keys روی سیستمهایی که میخواهید به آنها وارد شوید قرار میدهید. گواهی هم به عنوان کلید عمومی (به عنوان بخشی از انتقال اولیه) و هم به عنوان CA (در دایرکتوری authorized_keys) برای مجاز کردن استفاده شما از سیستمی که به آن وارد میشوید عمل میکند.
ابزار ssh همچنین مکانهایی را که به آنها متصل شده است در .ssh/known_hosts ذخیره میکند که همان CA در جهت مخالف است. به همین دلیل است که اگر قبلاً هرگز به سیستمی متصل نشده باشید از شما سؤال میپرسد، زیرا کلید را در CA خود ندارد. یا به همین دلیل اگر به سیستمی متصل شوید که قبلاً متصل شده بودید و گواهیها مطابقت نداشته باشند یا اعتبارسنجی با شکست مواجه شود، هشدار میدهد.
بنابراین اگر از گواهیهای خودامضا استفاده میکنید، باید مراقب باشید که فقط مواردی را که به آنها اعتماد دارید در CA قرار دهید. این امر بدیهی است که در یک سیستم بزرگ مانند وب جهانگستر امکانپذیر نیست، از این رو مراجع CA شخص ثالث معتبر ایجاد شدهاند.
اعتماد و رمزنگاری (TRUST AND CRYPTOGRAPHY)
مباحث فوق چندین بار به اعتماد اشاره کردند. رمزنگاری نیاز به اعتماد را از بین نمیبرد، بلکه فقط اعتماد را سادهتر و راحتتر میسازد. اگر کسی برای شما گواهی ارسال کرد، باید تأیید کنید که در واقع او بوده که گواهی را ارسال کرده و در حین انتقال دستکاری نشده است. اگر آن گواهی را به CA خود اضافه کنید، به گواهی اعتماد کردهاید و بهتر است مطمئن شوید (عموماً با اثرانگشتها یا fingerprints، برای جزئیات به اسناد openssl مراجعه کنید) که از یک نهاد مورد اعتماد آمده است.
سختترین بخش رمزنگاری به طور کلی مدیریت کلید است. شکستن الگوریتمهای رمزنگاری بسیار دشوار است؛ ترغیب افراد به افشای کلیدهای خصوصی یا استفاده از کلیدهای اشتباه بسیار آسانتر است.
برای اطلاعات بیشتر در مورد رمزنگاری به طور کلی، و رمزنگاری و اعتماد، بروس اشنایر (Bruce Schneier) کتابهای بسیار عالی در این زمینه دارد.
IPv6، IPv4 و نامهای میزبان (IPv6, IPv4, and host names)
توجه داشته باشید که یک نام میزبان واحد ممکن است منجر به بیش از یک آدرس شود. برای نمونه، ممکن است هم آدرس IPv4 و هم IPv6 داشته باشد. با اینها دقیقاً مانند چندین نام میزبان رفتار میشود. به عنوان مثال، اگر از localhost به عنوان نام میزبان استفاده کنید، عموماً هر دو نسخه IPv4 و IPv6 را دریافت میکنید:
- $ gensiot -a -p tcp,localhost,1234
Address 0(0): ipv6,::1,1234
Address 1(0): ipv4,127.0.0.1,1234
نام میزبان میتواند با پیشوند ipv4 یا ipv6 همراه باشد که اتصالات را به آن پروتکلها اجبار میکند. مشخص کردن ipv6n4 سوکتی ایجاد میکند که IPv6 است اما اتصالات IPv4 را نیز مدیریت میکند.
توجه داشته باشید که استفاده از ipv6n4 به طور خودکار سوکتی ایجاد نمیکند که برای IPv4 در دسترس باشد. مثلاً میتوانید tcp,ipv6n4,::1,1234 را انجام دهید و کار خواهد کرد، اما از آنجا که ::1 یک آدرس IPv4 نیست، نمیتوانید از طریق IPv4 به آن دسترسی داشته باشید. باید یک آدرس IPv4 مشخص کنید، مانند: tcp,ipv6n4,127.0.0.1,1234 که منجر به یک سوکت IPv6 واحد نگاشتشده در فضای IPv4 خواهد شد:
- $ gensiot -a -p tcp,ipv6n4,localhost,1234
Address 0(0): ipv6,::ffff:127.0.0.1,1234
اگر روی یک gensio پذیرنده (مانند sctp,1234) نام میزبان را مشخص نکنید، فقط یک سوکت IPv6 ایجاد میکند که به IPv4 نگاشت شده است. به این ترتیب هر دو اتصال IPv4 و IPv6 را میپذیرد. حتی اگر getaddrinfo معمولاً دو آدرس بازگرداند، فقط آدرس IPv6 استفاده میشود مگر اینکه هیچ آدرس IPv6 پیکربندی نشده باشد که در این صورت یک آدرس IPv4 بازمیگرداند.
به طور کلی، برای gensioهای متصلشونده تنها اولین آدرسی که پیدا شود استفاده خواهد شد. پروتکل SCTP استثنا است و قابلیت چندمیزبانی (multi-homing) را روی تمام آدرسهایی که به دست میآیند اجرا میکند. بنابراین ممکن است نیاز باشد در تعیین آدرسها کاملاً دقیق باشید.
میتوانید یک ماسک زیرشبکه (subnet mask) همراه با آدرس مشخص کنید، مانند:
- 192.168.33.0/24
این مورد به جز برای فراخوانیهای gensio_addr_addr_present() که آدرس دادهشده را با استفاده از ماسک زیرشبکه مشخصشده مقایسه میکند، عمدتاً نادیده گرفته میشود. در این حالت، طبق کاربرد عادی ماسک زیرشبکه، هر آدرسی از 192.168.33.0 تا 192.168.33.255 را میپذیرد. در حال حاضر هیچ چیزی در کتابخانه gensio از این استفاده نمیکند، اما ser2net از این ویژگی با گزینه remaddr خود برای مجاز کردن زیرشبکهها به عنوان آدرسهای راه دور استفاده میکند.
به طور کلی اگر هر دو در دسترس باشند، آدرسهای IPv6 ترجیح داده میشوند.
زمان در gensio (یا gtime)
زمان شامل مجموعهای از اعداد است که پس از هر کدام یک حرف تکی قرار دارد. آن حرف میتواند 'D'، 'H'، 'M'، 's'، 'm'، 'u' یا 'n' باشد که به ترتیب به معنای روز، ساعت، دقیقه، ثانیه، میلیثانیه، میکروثانیه یا نانوثانیه است. بنابراین برای نمونه "10D5H4M9s100u" برابر با ۱۰ روز، ۵ ساعت، ۴ دقیقه، ۹ ثانیه و ۱۰۰ میکروثانیه خواهد بود. اگر یک عدد ساده بدون حرف در انتها داده شود، مقدار ممکن است به یک واحد خاص پیشفرض شود که توسط gensio مربوطه مشخص خواهد شد.
مهلت تخلیه (Drain Timeout)
بسیاری از gensioها دادهها را در صف ارسال ذخیره میکنند. هنگام بستن اتصال، به طور پیشفرض منتظر میمانند تا خروجی قبل از اتمام بسته شدن به طور کامل ارسال شود.
معمولاً این همان چیزی است که میخواهید، اما در برخی شرایط ممکن است مطلوب نباشد. بنابراین این gensioها گزینه drain_timeout را پیادهسازی میکنند و یک کنترل متناظر برای تنظیم آن پس از ایجاد وجود دارد.
گزینه drain_timeout میزان زمان انتظار برای تخلیه دادهها هنگام بستن است. این مقدار زمان (به میلیثانیه) را تعیین میکند که gensio قبل از خاموش شدن با دادههای معلق منتظر تخلیه دادهها خواهد ماند. اگر این مقدار را منفی تنظیم کنید، برای همیشه منتظر میماند که این حالت پیشفرض است. هرچند واقعاً برای همیشه نیست، زیرا لایههای پایینتر قبل از رسیدن به این زمان دچار مهلت زمانی (timeout) شده و اتصال را قطع میکنند.
پارامتر nbits در auxdata
برخی gensioها توانایی انتقال دادهها در تعداد بیتهایی را دارند که مضربی از ۸ نیستند. مواردی که پردازش در سطح بیت انجام میدهند، مانند hdlc و convcode این کار را انجام میدهند.
این gensioها یک پارامتر "nbits" در auxdata روی رابطی که دادهها را از آن دریافت میکنند دریافت خواهند کرد و "nbits" را برای دادههایی که به لایه بعدی تحویل میدهند ارائه میدهند. این به صورت "nbits=n" است که در آن n یک عدد است.
مقدار "nbits" همیشه باید بین ۱ تا ۷ کمتر از طول بافر ارائهشده (به بایت) ضربدر ۸ باشد. بنابراین اگر بافری به طول ۱۰ بایت دارید، nbits میتواند از ۷۳ تا ۷۹ متغیر باشد. یا به عبارت دیگر، طول بافر همیشه از تعداد بیتها به بایت بعدی گرد میشود: ((nbits + 7) / 8).
اگر یک رابط "nbits" بپذیرد، در صورت عدم ارائه آن فرض میکند که nbits برابر با (<طول بافر> * 8) است.
این بدان معناست که اگر یک رابط داده دریافت کند، در صورتی که کل بافر را مصرف نکند همیشه باید مضربی از ۸ بیت مصرف کند. هیچ راهی برای بازگرداندن تعداد بیتهای مصرفشده وجود ندارد و تنها تعداد بایتها بازگردانده میشود.
TCP
tcp[(<options>)][,<hostname>],<port>[[,<hostname>],<port>[...]]
hostname = [ipv4|ipv6|ipv6n4,]<name>
یک TCP gensio متصلشونده باید hostname مشخصشده داشته باشد. میتوان چندین جفت hostname/port را مشخص کرد. برای یک TCP gensio متصلشونده، هر کدام به ترتیب آزمایش میشوند تا اتصال برقرار شود. برای gensioهای پذیرنده، به هر جفت hostname/port مشخصشده گوش داده میشود.
پورتهای پویا (Dynamic Ports)
برای پذیرندهها، اگر پورت به صورت صفر مشخص شود، یک پورت تصادفی در محدوده پورتهای پویای مشخصشده توسط IANA انتخاب میشود. اگر بیش از یک آدرس وجود داشته باشد، پورت یکسانی برای تمام آدرسها انتخاب خواهد شد. میتوانید با استفاده از تابع gensio_acc_control() با گزینه GENSIO_ACC_CONTROL_LPORT پورت را دریافت کنید.
دادههای خارج از باند (Out Of Band Data)
پروتکل TCP از دادههای خارج از باند (oob) پشتیبانی میکند؛ دادههایی که در اسرع وقت و خارج از ترتیب عادی تحویل داده میشوند. این دادهها در یک خواندن عادی اما با مقدار "oob" در auxdata میآیند. میتوانید با افزودن "oob" به auxdata در هنگام نوشتن داده oob ارسال کنید، اما نوشتن oob به ۱ بایت محدود است و نوشتن بیش از این مقدار منجر به رفتار تعریفنشده میشود. توجه داشته باشید که "oobtcp" نیز در auxdata تحویل و پذیرفته میشود، بنابراین میتوانید دادههای oob پروتکل TCP را از سایر دادههای oob تشخیص دهید.
گزینهها (Options)
علاوه بر readbuf، سوکت tcp gensio گزینههای زیر را میپذیرد:
- nodelay[=true|false]
- گزینه nodelay را روی سوکت تنظیم میکند.
- laddr=<addr>
- یک مشخصه آدرس برای bind شدن روی سوکت محلی جهت تنظیم آدرس محلی.
- reuseaddr[=true|false]
- گزینه SO_REUSEADDR را
روی سوکت
تنظیم
میکند.
برای
سوکتهای
پذیرنده،
این امکان
را میدهد
که سوکت به
محض بسته
شدن مجدداً
استفاده
شود. در
صورت false
بودن،
تأخیری قبل
از امکان
استفاده
مجدد وجود
خواهد داشت.
برای سوکتهای متصلشونده، اجازه میدهد laddr تنظیمشده برای چندین اتصال استفاده شود تا زمانی که به یک مقصد یکسان نباشند. در اینجا محدودیتهایی وجود دارد؛ به "SO_REUSEADDR" در "man 7 socket" مراجعه کنید.
پیشفرض true است. این ممکن است بهترین پیشفرض نباشد، زیرا ممکن است تداخلها و شرایط رقابتی (race conditions) ناشی از استفاده مجدد خیلی سریع سوکتها رخ دهد.
- tcpd=on|print|off
- فقط برای پذیرنده، مدیریت tcpd را روی سوکت تنظیم میکند. اگر "on" باشد، tcpd اعمال میشود و اتصال در صورت رد شدن توسط tcpd بسته میشود. مقدار "print" شبیه به on است، با این تفاوت که قبل از بستن سوکت عبارت "Access Denied" را روی آن مینویسد. مقدار "off" مدیریت tcpd را روی سوکت غیرفعال میکند. پیشفرض on است. در صورتی که tcpd در زمان کامپایل غیرفعال شده باشد در دسترس نیست.
- tcpdname=<name>
- فقط برای پذیرنده، نام مورد استفاده برای کنترل دسترسی tcpd را تعیین میکند. پیشفرض "gensio" است و میتوان آن را با gensio_set_progname() تغییر داد. این گزینه به شما امکان میدهد آن را به ازای هر پذیرنده gensio بازنویسی کنید. در صورت غیرفعال بودن tcpd در زمان کامپایل در دسترس نیست.
رشته آدرس راه دور (Remote Address String)
آدرس راه دور در قالب "[ipv4|ipv6],<addr>,<port>" خواهد بود که در آن آدرس در قالب عددی، IPv4 یا IPv6 است.
آدرس راه دور (Remote Address)
پروتکل TCP یک struct sockaddr استاندارد را برای کنترل GENSIO_CONTROL_RADDR_BIN بازمیگرداند.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const struct gensio_addr *" تخصیص مییابد.
UDP
udp[(<options>)][,<hostname>],<port>[[,<hostname>],<port>[...]]
hostname = [ipv4|ipv6|ipv6n4,]<name>
unixdgram[(<options>)][,<socket_path>]
یک UDP gensio یک سوکت UDP ایجاد میکند، اما آن را شبیه به یک جریان داده غیرقابل اعتماد جلوه میدهد. مشخصات آن مانند سوکت TCP است، به جز اینکه بدیهی است سوکت UDP ایجاد میشود.
سوکت unixdgram یک سوکت دیتاگرام یونیکس است. این سوکت معنایی شبیه به UDP دارد که در زیر شرح داده شده است. تنها تفاوت این است که اگر بدون اختصاص دادن laddr داده ارسال کنید، آدرسی نخواهید داشت. gensio پذیرنده آدرسی دریافت نخواهد کرد و اگر تلاش کند پاسخی برای شما ارسال کند، با خطا مواجه خواهد شد.
معنای سوکت UDP کمی متفاوت است. یک سوکت UDP متصلشونده نسبتاً ساده است: یک سوکت محلی باز میکند و دادهها را به سوکت راه دور میفرستد.
یک UDP gensio پذیرنده چندان ساده نیست. gensio پذیرنده برای هر بستهای که از یک میزبان راه دور جدید دریافت میکند یک gensio پذیرفتهشده جدید ایجاد خواهد کرد. اگر خواندن را روی هر یک از gensioهای پذیرفتهشده غیرفعال کنید یا پذیرشها را روی gensio پذیرنده غیرفعال کنید، تمام خواندنها روی همه gensioهای مرتبط با آن gensio پذیرنده متوقف خواهد شد.
توجه داشته باشید که gensioهای پذیرنده UDP واقعاً برای استفاده از UDP الزامی نیستند؛ آنها اساساً برای مدیریت مفاهیم پذیرنده ser2net حضور دارند. میتوانید دو UDP gensio متصلشونده ایجاد کرده و بین آنها ارتباط برقرار کنید.
Gensioهای UDP قابل اعتماد نیستند، اما بدیهی است که بستهمحور هستند.
پورت 0 درست مانند TCP برای پذیرندهها پشتیبانی میشود؛ برای جزئیات به بخش پورتهای پویا در بخش TCP در بالا مراجعه کنید.
آدرس مقصد به طور پیشفرض همان آدرس مشخصشده در تعریف gensio (برای gensioهای متصلشونده) یا آدرس راه دوری است که اتصال را آغاز کرده است (برای gensioهای پذیرنده)، اما میتوان آن را با استفاده از "addr:<addr>" در auxdata هنگام نوشتن بازنویسی کرد.
گزینهها (Options)
علاوه بر readbuf، سوکت udp gensio گزینههای زیر را میپذیرد:
- laddr=<addr>
- یک مشخصه آدرس برای bind شدن روی سوکت محلی جهت تنظیم آدرس محلی.
- nocon[=true|false]
- اتصالمحور نباشد، فقط همه بستهها را دریافت کرده و بدون برقراری اتصال تحویل دهد. فقط برای gensio کلاینت معتبر است. آدرس دریافت به صورت پیشوند با "addr:" به auxdata ارسال میشود؛ این آدرسی است که توسط gensio_addr_to_str() قالببندی شده است.
- mloop[=true|false]
- فقط برای UDP. اگر false باشد، بستههای چندپخشی ارسالشده روی میزبان محلی دریافت نخواهند شد. اگر true باشد، دریافت میشوند.
- mttl=[1-255]
- فقط برای UDP. مقدار Time-to-Live چندپخشی را تنظیم میکند. پیشفرض ۱ است، به این معنی که چندپخشی در شبکه محلی باقی میماند. افزایش این مقدار تعداد گامها (hops) روی روترهای چندپخشی را که بسته ارسالی طی میکند افزایش میدهد.
- mcast=<addr>
- فقط برای UDP. آدرسی برای دریافت بستههای چندپخشی اضافه میکند. شماره پورتی وجود ندارد، این فقط آدرس است. میتوانید چندین آدرس را در یک گزینه چندپخشی مشخص کنید و/یا گزینه چندپخشی میتواند چندین بار برای افزودن چندین آدرس چندپخشی استفاده شود.
- reuseaddr[=true|false]
- فقط برای UDP. گزینه SO_REUSEADDR را روی سوکت تنظیم میکند که برای gensioهای متصلشونده و پذیرنده مناسب است. پیشفرض false است. delsock[=true|false] فقط برای unixdomain. اگر مسیر سوکت از قبل وجود دارد، قبل از باز کردن سوکت آن را حذف کن.
- umode=[0-7|[rwx]*]
- فقط برای unixdomain. حالت فایل کاربر را برای فایل سوکت یونیکس تنظیم میکند. این همان ماسک بیتی معمولی read(4)/write(2)/execute(1) طبق chmod است، اما فقط برای بخش کاربر. اگر حالتی مشخص شود، سایر حالتها به طور پیشفرض "6" (rw) خواهند بود مگر اینکه مشخص شوند، و حالت نهایی توسط umask طبق اصول استاندارد نایکس تغییر مییابد. اگر حالتی مشخص نشود، روی مقدار پیشفرض تنظیم شده و تغییر نمیکند. توجه داشته باشید که گزینه perm در زیر احتمالاً راه بهتری برای تنظیم این مورد است.
- gmode=[0-7|[rwx]*]
- فقط برای unixdomain. حالت فایل گروه را برای فایل سوکت یونیکس تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- omode=[0-7|[rwx]*]
- فقط برای unixdomain. حالت فایل دیگران را برای فایل سوکت یونیکس تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- perm=[0-7][0-7][0-7]
- فقط برای unixdomain. حالت کامل فایل سوکت یونیکس را طبق اصول استاندارد نایکس تنظیم میکند که مانند عملیاتهای فوق توسط umask تغییر مییابد.
- owner=<name>
- فقط برای unixdomain. مالک فایل سوکت یونیکس را روی کاربر دادهشده تنظیم میکند.
- group=<name>
- فقط برای unixdomain. گروه فایل سوکت یونیکس را روی گروه دادهشده تنظیم میکند.
رشته آدرس راه دور (Remote Address String)
آدرس راه دور در قالب "[ipv4|ipv6],<addr>,<port>" خواهد بود که در آن آدرس در قالب عددی، IPv4 یا IPv6 است. یا برای unixdomain به صورت "unix,<socket path>" خواهد بود.
آدرس راه دور (Remote Address)
پروتکل UDP یک struct sockaddr استاندارد را برای کنترل GENSIO_CONTROL_RADDR_BIN بازمیگرداند.
چندپخشی UDP (UDP Multicast)
چندپخشی را میتوان روی gensioهای UDP با گزینههای nocon, maddr و laddr استفاده کرد. برای راهاندازی یک چندپخشی، یک UDP gensio کلاینت ایجاد کرده و laddr را برای پورت دریافت و آدرس مقصد را روی چندپخشی تنظیم کرده و nocon را فعال کنید، مانند:
- "udp(mcast='ff02::1',laddr='ipv6,3000',nocon),ff02::1,3000"
و شما دادهها را روی آدرس چندپخشی دریافت کرده و ارسال خواهید کرد. گزینه laddr برای تنظیم پورت دریافت الزامی است. این بدان معناست که شما یک آدرس محلی نیز خواهید داشت و بستهها را روی آن نیز دریافت خواهید کرد.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const struct gensio_addr *" تخصیص مییابد.
SCTP
sctp[(<options>)][,<hostname>],<port>[[,<hostname>],<port>[...]]
hostname = [ipv4|ipv6|ipv6n4,]<name>
یک SCTP gensio مانند UDP یا TCP مشخص میشود. با این حال، رفتار آن متفاوت است. برای یک gensio متصلشونده، تلاش میکند یک اتصال چندمیزبانی (multi-homed) با تمام نامهای میزبان و پورتهای مشخصشده ایجاد کند. تمام پورتها باید یکسان باشند.
برای یک gensio پذیرنده، یک سوکت واحد با تمام آدرسهای مشخصشده به عنوان مقصدهای ممکن ایجاد میکند. مجدداً، تمام پورتها باید یکسان باشند.
Gensioهای SCTP قابل اعتماد هستند. در حال حاضر آنها بستهمحور نیستند. در حال حاضر هیچ پشتیبانی از SCTP_EXPLICIT_EOR در پیادهسازی لینوکس SCTP وجود ندارد و بدون آن تبدیل آن به حالت بستهمحور دشوار خواهد بود.
هنگام تعیین آدرسهای IPv6 که ممکن است به IPv4 نگاشت شوند، باید مراقب باشید. اگر یک طرف بتواند IPv4 را انجام دهد و طرف دیگر فقط بتواند IPv6 را انجام دهد، اتصال ممکن است برقرار شود، اما به سرعت قطع خواهد شد زیرا نمیتواند در سمت IPv4 ارتباط برقرار کند. برای نمونه، پذیرنده زیر:
- tools/gensiot -a "sctp,ipv6,::,1234"
و متصلکننده زیر:
- tools/gensiot "sctp,::1,1234"
به این شکل با شکست مواجه خواهند شد زیرا متصلکننده از آدرس IPv4 پشتیبانی میکند اما پذیرنده پشتیبانی نمیکند.
الگوریتم Nagle و SCTP
پروتکل SCTP الگوریتم Nagle را به طور پیشفرض پیادهسازی میکند که در صورت تنظیم sack_freq روی بیش از یک، میتواند تداخل نامناسبی ایجاد کند. حداقل لینوکس مقدار پیشفرض sack_freq را روی ۲ قرار میدهد، اما gensio این مقدار را بازنویسی میکند تا از رفتارهای غیرمنتظره جلوگیری شود. آنچه اتفاق میافتد این است که در برخی شرایط ممکن است بستهای تأییدنشده (unacked) باقی بماند، زیرا sack_freq بزرگتر از یک است. الگوریتم Nagle هیچ داده جدیدی را تا زمانی که دادههای قبلاً ارسالشده تأیید نشوند ارسال نخواهد کرد. بنابراین یک طرف منتظر بسته جدیدی است تا sack ارسال کند، و طرف دیگر دادهها را نگه میدارد تا یک sack دریافت کند. بنابراین شما منتظر sack_delay میمانید که در آن زمان sack ارسال شده و کار دوباره از سر گرفته میشود.
اگر sack_freq را تغییر میدهید باید از این موضوع آگاه باشید.
گزینهها (Options)
علاوه بر readbuf، پروتکل sctp gensio گزینههای زیر را میپذیرد:
- instreams=<n>
- ostreams=<n>
- این گزینهها تعداد جریانهای ورودی و خروجی را برای اتصال مشخص میکنند. پیشفرض یک است. جریان در auxdata برای خواندن و نوشتن در قالب "stream=<n>" ارائه میشود.
- sack_freq=<n>
- sack_delay=<n>
- این گزینهها نحوه مدیریت تأییدیههای انتخابی (sacks) را مشخص میکنند. sack_freq تعداد بستههای معلقی را که باید قبل از ارسال sack دریافت شوند تنظیم میکند. پیشفرض ۱ است، به این معنی که اصلاً منتظر نمیماند. sack_delay حداکثر زمان قبل از ارسال sack در صورت وجود بستههای معلق را به میلیثانیه تنظیم میکند. پیشفرض ۱۰ است، اما در صورتی که sack_freq روی ۱ تنظیم شده باشد غیرفعال میشود. تنظیم هر یک از اینها روی ۰ پیشفرضهای سیستم را فعال میکند.
- nodelay[=true|false]
- گزینه nodelay را روی سوکت تنظیم میکند.
- laddr=<addr>
- یک مشخصه آدرس برای bind شدن روی سوکت محلی جهت تنظیم آدرس محلی.
- reuseaddr[=true|false]
- گزینه SO_REUSEADDR را
روی سوکت
تنظیم
میکند.
برای
سوکتهای
پذیرنده،
اجازه
میدهد
سوکت به محض
بسته شدن
مجدداً
استفاده
شود. در
صورت false
بودن،
تأخیری قبل
از امکان
استفاده
مجدد وجود
خواهد داشت.
برای سوکتهای متصلشونده، اجازه میدهد laddr تنظیمشده برای چندین اتصال استفاده شود تا زمانی که به یک مقصد یکسان نباشند. در اینجا محدودیتهایی وجود دارد؛ به "SO_REUSEADDR" در "man 7 socket" مراجعه کنید.
پیشفرض true است. این ممکن است بهترین پیشفرض نباشد، زیرا تداخلهای احتمالی ناشی از استفاده مجدد خیلی سریع سوکتها وجود دارد.
- پورت 0 درست مانند TCP برای پذیرندهها پشتیبانی میشود؛ برای جزئیات به بخش پورتهای پویا در بخش TCP در بالا مراجعه کنید.
-
پروتکل SCTP از دادههای خارج از باند (oob) پشتیبانی میکند؛ دادههایی که در اسرع وقت و خارج از نوبت تحویل داده میشوند. این دادهها در یک خواندن عادی اما با "oob" در auxdata میآیند. میتوانید با افزودن "oob" به auxdata در هنگام نوشتن داده oob ارسال کنید.
برای جزئیات بیشتر به اسناد SCTP مراجعه کنید.
رشته آدرس راه دور (Remote Address String)
آدرس راه دور در قالب "[ipv4|ipv6],<addr>,<port>[;[ipv4|ipv6],<addr>,<port>[...]]" خواهد بود که در آن آدرس در قالب عددی، IPv4 یا IPv6 است. هر آدرس راه دور برای اتصال SCTP فهرست میشود.
آدرس راه دور (Remote Address)
پروتکل SCTP یک struct sockaddr فشرده را برای کنترل GENSIO_CONTROL_RADDR_BIN طبق اصول SCTP بازمیگرداند.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const struct gensio_addr *" تخصیص مییابد.
UNIX
unix[(<options>)],<socket_path> unixseq[(<options>)],<socket_path>
یک سوکت جریانی یونیکس دامین را به عنوان پذیرنده ایجاد میکند، یا به عنوان متصلکننده به یک سوکت یونیکس دامین متصل میشود. گزینه unixseq مانند unix است، اما سوکتهای SOCK_SEQPACKET را به جای سوکت SOCK_STREAM ایجاد میکند. این سوکت مانند unix کار میکند، به جز اینکه بستهمحور است.
اگرچه ممکن است عجیب به نظر برسد، اما unix gensio روی ویندوز نیز در دسترس است و تقریباً همانند سیستمهای یونیکس کار میکند. با این حال unixseq و unixdgram در حال حاضر روی ویندوز در دسترس نیستند. با این وجود، نمیتوانید مجوزها را مانند ویندوز تنظیم کنید. ایجاد چیزی که کار کند ممکن است، اما پیچیده است. برای مجوزها، میتوانید دایرکتوری با مجوزهای مورد نظر خود ایجاد کنید و سپس سوکت را در آن دایرکتوری بسازید. سوکت به طور پیشفرض مجوزهای دایرکتوری را به ارث میبرد.
فایلی با مسیر سوکت دادهشده ایجاد خواهد شد؛ شما باید مجوزهای ایجاد یک فایل قابل نوشتن را در آن مکان داشته باشید. اگر فایل از قبل وجود داشته باشد، روی یک سوکت پذیرنده خطا بازگردانده میشود مگر اینکه delsock را مشخص کنید که باعث حذف فایل میشود.
برای جزئیات بیشتر در مورد اصول این سوکتها، به ویژه مجوزها، باید صفحه راهنمای unix(7) را بخوانید. گزینههای زیر امکان تنظیم مجوزها و مالکیتهای مختلف فایل را فراهم میکنند، اما بسته به سیستمعامل خاص ممکن است تأثیری بر اینکه چه کسی میتواند سوکت را باز کند نداشته باشد. برنامههای چندسکویی نباید برای امنیت به این مجوزها تکیه کنند. همچنین توجه داشته باشید که اعتبارسنجی راه دور لینوکس (Linux remote credentials) در حال حاضر پیادهسازی نشده است.
گزینهها (Options)
علاوه بر readbuf، سوکت unix gensio گزینههای زیر را میپذیرد:
- delsock[=true|false]
- اگر مسیر سوکت از قبل وجود دارد، قبل از باز کردن سوکت آن را حذف کن.
- umode=[0-7|[rwx]*]
- حالت فایل کاربر را برای فایل سوکت یونیکس تنظیم میکند. این همان ماسک بیتی معمولی read(4)/write(2)/execute(1) طبق chmod است، اما فقط برای بخش کاربر. اگر حالتی مشخص شود، سایر حالتها به طور پیشفرض "6" (rw) خواهند بود مگر اینکه مشخص شوند، و حالت نهایی توسط umask طبق اصول استاندارد نایکس تغییر مییابد. اگر حالتی مشخص نشود، روی مقدار پیشفرض تنظیم شده و تغییر نمیکند. توجه داشته باشید که گزینه perm در زیر احتمالاً راه بهتری برای تنظیم این مورد است. روی ویندوز موجود نیست.
- gmode=[0-7|[rwx]*]
- حالت فایل گروه را برای فایل سوکت یونیکس تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- omode=[0-7|[rwx]*]
- حالت فایل دیگران را برای فایل سوکت یونیکس تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- perm=[0-7][0-7][0-7]
- حالت کامل را برای فایل سوکت یونیکس طبق اصول استاندارد نایکس تنظیم میکند که مانند عملیاتهای فوق توسط umask تغییر مییابد. روی ویندوز موجود نیست.
- owner=<name>
- مالک فایل سوکت یونیکس را روی کاربر دادهشده تنظیم میکند. روی ویندوز موجود نیست.
- group=<name>
- گروه فایل سوکت یونیکس را روی گروه دادهشده تنظیم میکند. روی ویندوز موجود نیست.
- peerusers=<name>[;<name>[;...]]
- کاربران مجاز نایکس را برای اتصال به این سوکت تعیین میکند. در صورت تنظیم، هر اتصالی که از کاربری خارج از این فهرست دریافت شود باعث میشود اتصال فوراً بسته شود. میتوانید peerusers و peergroups را با هم استفاده کنید؛ در این صورت اگر هر یک از بررسیها موفق باشد، اتصال مجاز خواهد بود. روی ویندوز موجود نیست.
- peergrps=<name>[;<name>[;...]]
- گروههای مجاز نایکس را برای اتصال به این سوکت تعیین میکند. در صورت تنظیم، هر اتصالی که از کاربرانی دریافت شود که گروه آنها در این فهرست نیست باعث میشود اتصال فوراً بسته شود. روی ویندوز موجود نیست.
رشته آدرس راه دور (Remote Address String)
آدرس راه دور به این صورت خواهد بود: "unix,<socket path>".
آدرس راه دور (Remote Address)
پروتکل UNIX یک struct sockaddr_un استاندارد را برای کنترل GENSIO_CONTROL_RADDR_BIN بازمیگرداند.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const struct gensio_addr *" تخصیص مییابد.
serialdev
connecting = serialdev[(<options>)],<device>[,<serialoption>[,<serialoption>]]
یک اتصال serialdev یک پورت سریال محلی است. دستگاه در سیستمهای شبیه یونیکس از نوع /dev/xxx است و باید یک دستگاه جریانی واقعی از نوعی باشد که پردازش عادی termios یا سریال روی آن کار میکند.
در سیستمهای ویندوز، دستگاه به صورت //./COM<n> است که در آن <n> شماره پورتی است که در Device Manager میبینید. توجه داشته باشید که اینها هنگام راهاندازی مجدد سیستم ممکن است جابهجا شوند؛ مطمئن نیستم راهی برای رفع آن وجود داشته باشد.
برای دستگاههای غیرسریال، از gensio نوع "dev" استفاده کنید.
این گزینه، بدون شگفتی، یک gensio سریال است.
همچنین میتوانید برای خلاصه کردن به جای "serialdev" از "sdev" استفاده کنید.
یک مشکل در مورد serialdev و قفلگذاری UUCP این است که اگر در حین باز بودن دستگاه، یک فرایند را با fork() منشعب کنید، فرایند منشعبشده دارای serialdev خواهد بود اما مقدار موجود در فایل قفل UUCP نادرست خواهد بود. کار زیادی نمیتوان در این مورد انجام داد، بنابراین مراقب باشید.
گزینهها (Options)
علاوه بر readbuf، ماژول serialdev gensio گزینههای زیر را میپذیرد:
- uucplock[=true|false]
- قفلگذاری UUCP را روی دستگاه فعال یا غیرفعال میکند. پیشفرض برای همه چیز به جز دستگاههای pty و /dev/tty برابر با true است. در سیستمهایی که از این قابلیت پشتیبانی نمیکنند نادیده گرفته میشود.
- flock[=true|false]
- قفلگذاری flock را روی دستگاه فعال یا غیرفعال میکند. پیشفرض برای همه چیز به جز /dev/tty برابر با true است. توجه داشته باشید که این کار هم "flock(fd, LOCK_EX | LOCK_NB)" و هم "ioctl(fd, TIOCNXCL)" را برای قفل کردن دستگاه انجام میدهد. در سیستمهایی که از این قابلیت پشتیبانی نمیکنند نادیده گرفته میشود.
- drain_time=off|<time in 100ths of a second>
- کل مدت زمان انتظار برای ارسال دادهها روی پورت سریال در زمان بستن اتصال. بسته شدن به این میزان زمان یا تا زمانی که تمام دادهها ارسال شوند به تعویق میافتد. پیشفرض off است. هنگام تنظیم مقدار پیشفرض برای این مورد، "off" پذیرفته نخواهد شد، در عوض از -1 استفاده کنید.
- char_drain_wait=off|<time in 100ths of a second>
- در زمان بستن، اگر این مقدار زمان سپری شود و هیچ نویسهای ارسال نشود، بستن را به پایان برسان. پیشفرض 50 (۰.۵ ثانیه) است. توجه داشته باشید که اگر هم این مورد و هم drain_time خاموش باشند، در صورتی که پورت سریال در کنترل جریان معلق بماند، هرگز بسته نخواهد شد. هنگام تنظیم مقدار پیشفرض برای این مورد، "off" پذیرفته نخواهد شد، در عوض از -1 استفاده کنید.
- wronly[=true|false]
- دستگاه را روی حالت فقط-نوشتنی تنظیم میکند. پیشفرض false است. rdonly[=true|false] دستگاه را روی حالت فقط-خواندنی تنظیم میکند. پیشفرض false است.
گزینههای سریال (Serialoptions)
مجموعه گستردهای از گزینههای سریال وجود دارد که به عنوان پیشفرض در دسترس هستند:
- [speed=]<speed><parity><databits><stopbits>
- این مشخصات
استاندارد
پیکربندی
پورت سریال
است؛
پیشفرض
"9600N81" است.
عبارت "speed="
در ابتدا
اختیاری
است، اما
"speed" یک نوع
پیشفرض
برای این
مورد است.
تنظیمات <speed> (یا baud rate) یک عدد است. بسته به پورت سریال خاص، این میتواند تقریباً هر عددی باشد. برخی از پورتهای سریال در برخی سیستمها از هر عدد دلخواهی پشتیبانی میکنند، برخی دیگر اعداد خاصی دارند که پشتیبانی میشوند.
تنظیمات <parity> یکی از موارد "N"، "E"، "O"، "M"، "S" برای none (هیچ)، even (زوج)، odd (فرد)، mark و space است.
مقدار <databits> عددی بین ۵ تا ۸ است. این گزینه تعداد بیتهای ارسالی برای هر نویسه را تعیین میکند و عموماً ۸ است.
مقدار <stopbits> تعداد بیتها برای مشخص کردن پایان یک نویسه است که ۱ یا ۲ است.
تنها چیزی که واقعاً نیاز دارید این است که بدانید مقداری که به آن متصل میشوید چیست. برای جزئیات بیشتر، به https://en.wikipedia.org/wiki/Serial_port مراجعه کنید.
- wronly[=true|false]
- این گزینه
منسوخ شده
است، برای
دستگاههای
پورت
غیرسریال
از gensio نوع "dev" و
از گزینه wronly
در
پارامترها
استفاده
کنید.
دستگاه را روی حالت فقط-نوشتنی تنظیم میکند. هیچ تعریفی از termios روی پورت انجام نمیشود. این کار میتواند برای مثال برای ارتباط با یک پورت چاپگر خطی انجام شود. به طور پیشفرض false است. توجه داشته باشید که بنا به دلایل تاریخی این گزینه با گزینه wronly تنظیمشده در پارامترها متفاوت است؛ این گزینه هم پردازش termios را غیرفعال میکند و هم wronly را تنظیم مینماید.
- nobreak[=true|false]
- خط break را در شروع پاک میکند (یا پاک نمیکند). پیشفرض این است که آن را پاک نکند (false).
- rs485=off|<delay rts before send>:<delay rts after send>[:<conf>[:<conf>]]
- پروتکل RS-485 را
برای پورت
سریال
راهاندازی
میکند. دو
پارامتر
اول تأخیر RTS
(به
میلیثانیه)
را قبل و
بعد از
ارسال
تنظیم
میکنند.
مقادیر conf
میتوانند
شامل این
موارد
باشند: "rts_on_send" -
تنظیم RTS
هنگام
ارسال،
"rts_after_send" - تنظیم RTS
پس از
ارسال، "rx_during_tx"
- امکان
دریافت و
ارسال
همزمان، و
"terminate_bus" -
فعالسازی
ترمینیشن
گذرگاه.
استفاده از "off" قابلیت rs485 را غیرفعال میکند؛ این مورد برای لغو تنظیمات پیشفرض تعریفشده توسط کاربر مفید است. پیشفرض "off" است.
- xonxoff[=true|false]
- کنترل جریان xon/xoff را فعال/غیرفعال میکند. پیشفرض false است.
- rtscts[=true|false]
- کنترل جریان rts/cts را فعال/غیرفعال میکند. پیشفرض false است.
- local[=true|false]
- خطوط کنترل مودم را نادیده میگیرد/نمیگیرد. پیشفرض این است که آنها را نادیده نگیرد (false). با این حال، اگر خطوط کنترل مودم را نادیده نگیرید، میتواند منجر به تأخیرهای طولانی در خاموش شدن شود.
- dtr[=on|off]
- خط DTR را هنگام باز شدن gensio مجبور میکند روشن یا خاموش باشد. توجه داشته باشید که ترتیب گزینههای dtr و rts اهمیت دارد. هر کدام که در گزینهها زودتر بیاید اول تنظیم خواهد شد. اگر خطوط برای قطعه سختافزاری مربوطه باید با ترتیب خاصی توالی داده شوند، این میتواند مفید باشد.
- rts[=on|off]
- خط RTS را هنگام باز شدن gensio مجبور میکند روشن یا خاموش باشد. برای نکات مربوط به ترتیب خطوط به بخش dtr در بالا مراجعه کنید.
- hangup-when-done[=true|false]
- در صورت
تنظیم روی
true، خطوط
کنترل مودم
(DTR و
احتمالاً RTS)
را هنگام
باز شدن
دستگاه
بالا
میبرد و
هنگام بسته
شدن پایین
میآورد.
این باعث
میشود DTR در
زمان باز
شدن فعال و
در زمان
بسته شدن
پاک شود.
اگر RTS با rtscts
تخصیص داده
نشده باشد،
همین کار را
با خط RTS
انجام
میدهد.
پیشفرض
این است که
مقدار را در
هنگام
راهاندازی
تغییر ندهد
و مقدار
قبلی را به
ارث ببرد.
اگر مقدار
را تغییر
دهید،
مقدار پس از
بستن حفظ
خواهد شد؛
در غیر این
صورت در
هنگام بستن
به درستی
کار نخواهد
کرد.
در مقدار پیشفرض برای این مورد، این یک عدد صحیح است: -1 یعنی مقدار را تنظیم نکن، 0 یعنی خاموش کن، 1 یعنی روشن کن.
- custspeed[=true|false]
- تنظیم baud rateهای سفارشی را مجاز/غیرمجاز میکند. اگر baud rateهای سفارشی پشتیبانی نشوند نادیده گرفته میشود. به طور معمول فقط baud rateهای استاندارد پشتیبانی میشوند (1200، 2400 و غیره). در صورت پشتیبانی توسط سختافزار، این گزینه اجازه میدهد هر مقدار دلخواهی تنظیم شود.
رشته آدرس راه دور (Remote Address String)
رشته آدرس راه دور، دستگاه و پارامترهای سریال است، در قالبی مانند "9600N81[,<option>[,<option>[...]]]". گزینهها یکی از این موارد هستند: XONXOFF، RTSCTS، CLOCAL، HANGUP_WHEN_DONE، RTSHI، RTSLO، DTRHI، DRLO، offline.
شناسه راه دور (Remote ID)
شناسه راه دور برای serialdev توصیفگر فایل (file descriptor) است که به صورت عدد صحیح بازگردانده میشود.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const char *" شامل رشته دستگاه و پارامترها تخصیص مییابد.
dev
dev[(<options>)],<device> این گزینه شبیه به یک serialdev gensio است، اما هیچ پردازش پورت سریالی مانند termios یا پردازش break را انجام نمیدهد. این میتواند برای مثال برای دستگاههای /dev/lpX استفاده شود. این مورد به طور پیشفرض خواندنی/نوشتنی است؛ باید گزینه wronly را برای غیرفعال کردن دسترسی خواندن برای یک دستگاه فقط-نوشتنی و rdonly را برای غیرفعال کردن دسترسی نوشتن برای دستگاههای فقط-خواندنی تنظیم کنید.
این گزینه همان گزینههای serialdev را میپذیرد با این تفاوت که قفلگذاری انجام نمیدهد. گزینههای drain_time و char_drain_wait ممکن است کار کنند یا نکنند. این ماژول گزینههای سریال را نمیپذیرد.
stdio
accepter = stdio[(options)]
connecting = stdio[(options)],<program>
ماژول stdio gensio موردی نسبتاً خاص اما بسیار کاربردی است.
یک stdio gensio متصلشونده برنامه دادهشده را اجرا میکند (مگر اینکه self به عنوان یک گزینه تنظیم شده باشد) و ورودی و خروجی استاندارد آن را به کانال اصلی gensio متصل میکند. بنابراین اجرای یک برنامه و تعامل با آن آسان است. اگر میخواهید stderr را از gensio دریافت کنید، یک کانال روی gensio کانال اصلی باز کنید، به زیر مراجعه نمایید.
نکته: اگرچه epoll() با فایلهای معمولی کار نمیکند، اما stdio gensio مدیریت ویژهای برای فایلهای معمولی دارد بنابراین آنها بیشتر اوقات کار میکنند. اگر از stdin به عنوان یک فایل معمولی استفاده کنید، این میتواند عوارض جانبی غیرمنتظرهای داشته باشد. هنگامی که به انتهای stdin برسید، stdio gensio مقدار GE_REMCLOSE را برمیگرداند و ممکن است gensio را خاموش کرده و احتمالاً هر خروجی ارسالشده به stdout را از دست بدهید. در صورت امکان از file gensio استفاده کنید.
برای gensioهای متصلشونده، در فرایند منشعبشده، در صورتی که uid و guid مؤثر و واقعی متفاوت باشند، کد مربوطه uid و guid مؤثر (و ذخیرهشده) را روی uid و guid واقعی فعلی تنظیم میکند. به این ترتیب کاربر میتواند uid و gid واقعی را روی مقداری که میخواهد برنامه تحت آن اجرا شود تنظیم کند، اما uid و gid مؤثر را روی مقادیر (احتمالاً root) نگه دارد تا بتوان پس از باز کردن pty آنها را به آن مقادیر بازگرداند. فهرست گروهها نیز روی گروههایی که شناسه کاربری واقعی در آنها قرار دارد تنظیم میشود. توجه داشته باشید که اگر شناسههای کاربری مؤثر و واقعی یکسان باشند، کاری انجام نمیشود.
اگر هر دو stdin/stdout و stderr را باز کردهاید، برای بستن کامل gensio باید هر دوی آنها را ببندید. تا زمانی که هر دو بسته نشوند نمیتوانید gensio را دوباره باز کنید.
ماژول gensio متصلشونده از کنترل GENSIO_CONTROL_ENVIRONMENT پشتیبانی میکند تا امکان تنظیم محیط (environment) برای فرایند جدید فراهم شود.
یک gensio پذیرنده بلافاصله پس از شروع، اتصال برقرار کرده و stdin و stdout برنامه در حال اجرا را به gensio متصل میکند.
گزینهها (Options)
علاوه بر readbuf، یک stdio متصلشونده گزینههای زیر را میپذیرد:
- self[=true|false]
- به جای شروع یک برنامه، به stdio برنامه در حال اجرا متصل شو. این همانند یک stdio gensio پذیرنده است، با این تفاوت که نیازی به طی کردن فرایند accept ندارید.
- console[=true|false]
- شبیه به self، با این تفاوت که به دستگاه کنسول برنامه در حال اجرا متصل میشود؛ /dev/tty در یونیکس و CONIN$/CONOUT$ در ویندوز. برای خواندن گذرواژهها و موارد مشابه مفید است.
- start-dir=path
- زیربرنامه را به جای دایرکتوری فعلی، در مسیر دادهشده شروع کن.
- raw[=true|false]
- برای نسخه "self"، console یا accepter مربوط به gensio، بخش I/O را در حالت "raw" قرار میدهد؛ به این معنی که نویسه به نویسه پردازش میشود، ^C غیرفعال میشود و غیره. این روی لولهها (pipes) یا فایلها با شکست مواجه میشود.
- stderr-to-stdout
- خروجی خطای استاندارد را به جای داشتن یک کانال جداگانه برای آن، به خروجی استاندارد ارسال کن.
- noredir-stderr
- خروجی stderr برنامه را تغییر نده، از stderr برنامه فراخواننده استفاده کن. اگر میخواهید خروجی stderr را از یک برنامه ببینید این میتواند مفید باشد.
کانالها (Channels)
ماژول stdio gensio متصلشونده که برنامه دیگری را شروع میکند، stderr را به عنوان بخشی از gensio اصلی ارائه نمیدهد. برای دریافت خروجی stderr باید با gensio_alloc_channnel() یک کانال ایجاد کرده و سپس آن را باز کنید. آرگومانهای gensio_alloc_channel() میتواند یک "readbuf=<num>" اختیاری باشد و اندازه بافر ورودی را تنظیم میکند.
رشته آدرس راه دور (Remote Address String)
رشته آدرس راه دور برای کانال اصلی "stdio,<args>" یا برای کانال خطا "stderr,<args>" است. آرگومانها مجموعهای از رشتههای نقلقولشده با یک فاصله بین هر رشته خواهند بود، یکی برای هر آرگومان، با '"' در اطراف هر آرگومان، هر '"' در رشته به '\"' تبدیل شده و هر '\' در رشته به '\\' تبدیل میشود.
شناسه راه دور (Remote ID)
شناسه راه دور pid دستگاه راه دور است، فقط برای gensioهای متصلشونده که یک برنامه را شروع میکنند، نه برای هیچ نوع دیگری.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const char * const args[]" برای gensio تخصیص مییابد. gdata برای پذیرنده استفاده نمیشود.
echo
connecting = echo[(options)]
ماژول echo gensio تمام دادههای نوشتهشده در آن را بازتاب میدهد (echo میکند). برای آزمایش مفید است.
گزینهها (Options)
علاوه بر readbuf، یک echo متصلشونده گزینههای زیر را میپذیرد:
- noecho[=true|false]
- به جای بازتاب دادن دادهها، فقط به یک چاه داده (sink) تبدیل شو.
- data=<str>
- داده دادهشده را به عنوان دادهای که باید خوانده شود ارائه بده. در صورت ترکیب با noecho، یک gensio ایجاد میکند که فقط داده دادهشده را ارائه میدهد و سپس پس از اتمام یک GE_REMCLOSE بازمیگرداند.
رشته آدرس راه دور (Remote Address String)
رشته آدرس راه دور "echo" است.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio تخصیص مییابد، gdata استفاده نمیشود.
file
connecting = file[(options)]
ماژول file gensio یک فایل ورودی (اختیاری) و فایل خروجی (اختیاری) را برای gensio باز میکند. اگر نیاز به خواندن/نوشتن یک فایل در gensio دارید، باید از این استفاده کنید. رفتار مربوط به فایلها در stdio همیشه به درستی کار نمیکند.
اگر یک فایل ورودی مشخص شده باشد، دادهها از فایل ورودی خوانده شده و در رابط خواندن gensio تا انتهای فایل تحویل داده میشوند، جایی که خطای GE_REMCLOSE بازگردانده خواهد شد.
اگر یک فایل خروجی مشخص شده باشد، دادهها در هنگام نوشتن در فایل خروجی نوشته میشوند. فایل خروجی همیشه آماده دریافت داده است.
گزینهها (Options)
علاوه بر readbuf، یک file متصلشونده گزینههای زیر را میپذیرد:
- infile=filename
- نام فایل ورودی را تعیین میکند.
- outfile=filename
- نام فایل خروجی را تعیین میکند.
- read_close[=true|false]
- اگر true باشد (پیشفرض)، هنگام آماده بودن تمام دادههای فایل، خطای GE_REMCLOSE را در خواندن ایجاد میکند. اگر false باشد، فقط ارسال دادهها را متوقف میکند و GE_REMCLOSE را انجام نمیدهد. این در صورتی مفید است که فقط بخواهید مقداری داده تزریق کنید و سپس کاری انجام ندهید.
- create[=true|false]
- در صورت عدم وجود فایل خروجی، آن را ایجاد کن. برای خواندن نادیده گرفته میشود.
- append[=true|false]
- فایل را در حالت الحاق (append) باز کن. در صورت عدم تعیین، در ابتدای فایل باز میشود و در صورت نوشتن، بازنویسی (overwrite) خواهد کرد. برای خواندن نادیده گرفته میشود.
- trunc[=true|false]
- کوتاه کردن (truncate) فایل در هنگام باز کردن. در هنگام باز شدن تمام دادههای فایل حذف خواهند شد. برای خواندن نادیده گرفته میشود.
- binary[=true|false]
- فایل را در حالت باینری باز کن. این گزینه در سیستمهای نایکس نادیده گرفته میشود، اما برای ویندوز بر نحوه مدیریت خطوط جدید تأثیر میگذارد.
- umode=[0-7|[rwx]*]
- در صورت ایجاد فایل، حالت فایل کاربر را برای فایل تنظیم میکند. این همان ماسک بیتی معمولی read(4)/write(2)/execute(1) طبق chmod است، اما فقط برای بخش کاربر. اگر حالتی مشخص شود، سایر حالتها به طور پیشفرض "6" (rw) خواهند بود مگر اینکه مشخص شوند، و حالت نهایی توسط umask طبق اصول استاندارد نایکس تغییر مییابد. اگر حالتی مشخص نشود، روی مقدار پیشفرض تنظیم شده و تغییر نمیکند. توجه داشته باشید که گزینه perm در زیر احتمالاً راه بهتری برای تنظیم این مورد است.
- gmode=[0-7|[rwx]*]
- در صورت ایجاد فایل، حالت فایل گروه را برای آن تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- omode=[0-7|[rwx]*]
- در صورت ایجاد فایل، حالت فایل دیگران را برای آن تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- perm=[0-7][0-7][0-7]
- حالت کامل فایل را طبق اصول استاندارد نایکس تنظیم میکند که مانند عملیاتهای فوق توسط umask تغییر مییابد.
رشته آدرس راه دور (Remote Address String)
رشته آدرس راه دور "file([infile=<filename][,][outfile=<filename>])" است.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio تخصیص مییابد، gdata استفاده نمیشود.
dummy
accepter = dummy
ماژول dummy gensio accepter برای مواردی به عنوان جانگهدار (placeholder) کاربرد دارد که نمیخواهید یک پذیرنده فعال واقعی داشته باشید اما نیاز است چیزی قرار دهید.
همانطور که حدس میزنید، هیچ کاری انجام نمیدهد.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio تخصیص مییابد، gdata استفاده نمیشود.
ipmisol
ipmisol[(options)],<openipmi arguments>[,ipmisol option[,...]]
یک ipmisol gensio یک اتصال IPMI Serial Over LAN به یک سرور IPMI ایجاد میکند. برای اطلاعات در مورد آرگومانها به اسناد OpenIPMI مراجعه کنید.
این یک gensio سریال است، اما تنظیمات baud rate نسبتاً محدودی دارد.
گزینهها (Options)
علاوه بر readbuf، ماژول ipmisol gensio گزینههای زیر را میپذیرد:
- writebuf=<n>
- برای تنظیم اندازه بافر نوشتن.
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
همچنین گزینههای زیر را برای ipmisol میپذیرد:
- 9600, 19200, 38400, 57600, 115200
- نرخ Baud، به طور پیشفرض 9600 است. هر چیزی بعد از عدد برای سازگاری با مواردی مانند "N81" نادیده گرفته میشود. شما نمیتوانید آن مقادیر را برای ipmisol تنظیم کنید، آنها روی "N81" ثابت هستند.
- nobreak[=true|false]
- غیرفعالسازی پردازش break. پیشفرض false است.
- authenticated[=true|false]
- فعال یا غیرفعال کردن احراز هویت. پیشفرض true است.
- encrypted[=true|false]
- فعال یا غیرفعال کردن رمزگذاری. پیشفرض true است.
- deassert-CTS-DCD-DSR-on-connect[=true|false]
- پیشفرض false است.
- رفتار در مدیریت هشدارهای سریال. پیشفرض fail است.
- ack-timeout=<number>
- مدت زمان (به میکروثانیه) برای مهلت زمانی یک ack. پیشفرض 1000000 است.
- ack-retries=<number>
- تعداد دفعاتی (ack-timeouts) که یک ack قبل از صرفنظر کردن مجدداً ارسال میشود. پیشفرض 10 است.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const char *" تخصیص مییابد.
telnet
accepter = telnet[(options)]
connecting = telnet[(options)]
یک telnet gensio فیلتری است که روی یک gensio دیگر قرار میگیرد. این ماژول پروتکل استاندارد telnet را اجرا کرده و از RFC2217 پشتیبانی میکند.
گزینهها (Options)
علاوه بر readbuf، ماژول telnet gensio گزینههای زیر را میپذیرد:
- writebuf=<n>
- اندازه بافر نوشتن را تعیین میکند.
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- rfc2217[=true|false]
- حالت RFC2217 را برای این gensio فعال یا غیرفعال میکند. اگر این گزینه فعال باشد و سمت راه دور اتصال نیز از RFC2217 پشتیبانی کند، gensio به عنوان یک gensio سریال راهاندازی میشود و میتوانید مدیریت عادی serial gensio را روی آن انجام دهید.
- winsize[=true|false]
- استاندارد RFC1073 (اطلاعرسانی تغییر اندازه پنجره) را فعال یا غیرفعال میکند. پیشفرض false است.
- mode=client|server
- حالت telnet را روی client یا server تنظیم میکند. این به شما امکان میدهد یک سرور telnet را روی یک gensio متصلشونده، یا یک کلاینت telnet را روی یک gensio پذیرنده اجرا کنید.
اطلاعات راه دور (Remote info)
پروتکل telnet شناسه راه دور، آدرس راه دور و رشته راه دور را به gensio فرزند منتقل میکند.
ssl
accepter = ssl[(options)]
connecting = ssl[(options)]
یک SSL gensio پروتکل SSL/TLS را روی یک gensio دیگر اجرا میکند. آن gensio باید قابل اعتماد (reliable) باشد.
استفاده از آن بسیار سرراست است. سختترین بخش استفاده از SSL gensio گواهیها هستند. به یک SSL gensio سرور باید یک گواهی و یک کلید داده شود. به یک SSL gensio کلاینت باید یک مرجع صدور گواهی (CA) داده شود. کلاینت از مرجع گواهی استفاده میکند تا تأیید کند که سرور گواهی و کلیدهای مناسب را دارد.
این gensio گزینههایی دارد تا سرور گواهی را از کلاینت درخواست کرده و آن را اعتبارسنجی کند.
Gensioهای SSL قابل اعتماد هستند. آنها همچنین بستهمحور میباشند.
گزینهها (Options)
علاوه بر readbuf، ماژول SSL gensio گزینههای زیر را میپذیرد:
- writebuf=<n>
- اندازه بافر نوشتن را تعیین میکند.
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- CA=<filepath>
- مکانی را برای جستجوی گواهیها جهت احراز هویت تعیین میکند. اگر این مسیر با یک "/" خاتمه یابد، انتظار میرود دایرکتوریای باشد که شامل فایلهایی با گواهیهایی است که باید طبق OpenSSL هش شده باشند (برای جزئیات به دستور "openssl rehash" مراجعه کنید). در غیر این صورت یک فایل واحد است که شامل یک یا چند گواهی است. در صورت عدم تعیین، مسیر پیشفرض CA استفاده میشود. توجه داشته باشید که تنظیم این مورد روی یک رشته خالی آن را غیرفعال میکند، بنابراین در صورت لزوم میتوانید یک مقدار پیشفرض را لغو کنید.
- key=<filename>
- فایلی را برای دریافت کلید خصوصی سرور مشخص میکند. این گزینه برای سرورها الزامی است. ممکن است برای کلاینتها نیز مشخص شود، و در صورتی که سرور نیازمند گواهی باشد (CA تنظیم شده باشد) برای کلاینت الزامی است.
- cert=<filename>
- فایلی را مشخص میکند که شامل گواهی مورد استفاده برای اتصال است. در صورت عدم تعیین، انتظار میرود گواهی در فایل کلید باشد. توجه داشته باشید که تنظیم این مورد روی یک رشته خالی آن را غیرفعال میکند، بنابراین در صورت لزوم میتوانید مقدار پیشفرض را لغو کنید.
- mode=client|server
- به طور معمول یک gensio پذیرنده در حالت سرور و یک gensio متصلشونده در حالت کلاینت است. از این گزینه میتوان برای تغییر نقشها و اجرا در حالت سرور SSL روی یک gensio متصلشونده یا برعکس استفاده کرد.
- con-timeout=<gtime>
- مهلت زمانی را برای تکمیل اتصال تنظیم میکند. اگر فرایند اتصال در این مدت زمان تکمیل نشود، اتصال قطع خواهد شد. پیشفرض ۶۰ ثانیه است. برای اطلاعات بیشتر در مورد نحوه تنظیم زمان به بخش "gtime" مراجعه کنید. توجه داشته باشید که تنظیم پیشفرض برای con-timeout یک gtime نیست، بلکه یک عدد صحیح بر حسب ثانیه است.
- clientauth[=true|false]
- به طور معمول کلاینت توسط سرور احراز هویت نمیشود. این گزینه الزام میکند که کلاینت یک گواهی ارائه دهد و آن گواهی را احراز هویت میکند. برای حالت کلاینت نادیده گرفته میشود.
- allow-authfail[=true|false]
- به طور
معمول اگر
گواهی سمت
راه دور
معتبر
نباشد، SSL gensio
اتصال را
میبندد.
این گزینه
اجازه
میدهد باز
شدن اتصال
با یک گواهی
نامعتبر یا
گمشده
موفقیتآمیز
باشد. توجه
داشته
باشید که
کاربر باید
با استفاده
از gensio_is_authenticated()
بررسی کند
که آیا
احراز هویت
تنظیم شده
است یا خیر.
اعتبارسنجی Common Name انجام نمیشود. برنامه کاربردی باید این کار را انجام دهد؛ میتواند نام عمومی و سایر دادههای گواهی را از طریق یک رابط کنترلی دریافت کند.
میتوانید از گواهیهای خودامضا در این رابط استفاده کنید. فقط از پیامدهای امنیتی آن آگاه باشید. این gensio نسبتاً انعطافپذیر است، اما برای داشتن یک رابط امن باید با دقت از آن استفاده کنید.
ماژول SSL gensio کالبک رویداد gensio (کلاینت) یا کالبک رویداد پذیرنده gensio (سرور) را پس از دریافت گواهی اما قبل از اعتبارسنجی آن با رویدادهای GENSIO_EVENT_PRECERT_VERIFY یا GENSIO_ACC_EVENT_PRECERT_VERIFY فراخوانی میکند. این به کاربر امکان میدهد دادههای گواهی (مانند Common Name) را با GENSIO_CONTROL_GET_PEER_CERT_NAME اعتبارسنجی کند یا یک مرجع صدور گواهی را برای اعتبارسنجی با GENSIO_CONTROL_CERT_AUTH تنظیم نماید.
اطلاعات راه دور (Remote info)
پروتکل ssl شناسه راه دور، آدرس راه دور و رشته راه دور را به gensio فرزند منتقل میکند.
certauth
accepter = certauth[(options)]
connecting = certauth[(options)]
یک certauth gensio پروتکل احراز هویتی را روی یک gensio دیگر اجرا میکند. آن gensio باید قابل اعتماد و رمزگذاریشده باشد.
این مانند معکوس SSL است. کلاینت دارای کلید و گواهی است و سرور دارای مرجع صدور گواهی (CA) است. این ماژول همچنین از احراز هویت با گذرواژه پشتیبانی میکند.
پس از انجام احراز هویت، این gensio به عنوان یک عبوردهنده (passthrough) عمل میکند. گزینه readbuf در این gensio در دسترس نیست.
گزینهها (Options)
ماژول certauth gensio گزینههای زیر را میپذیرد:
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- CA=<filepath>
- مکانی را برای جستجوی گواهیها جهت احراز هویت تنظیم میکند. اگر با "/" خاتمه یابد، انتظار میرود دایرکتوریای شامل فایلهایی با گواهیها باشد که طبق OpenSSL باید هش شده باشند، برای جزئیات به gensio-keygen(1) در بخش rehash مراجعه کنید. در غیر این صورت یک فایل واحد است که شامل یک یا چند گواهی است. در صورت عدم تعیین، مسیر پیشفرض CA برای openssl استفاده میشود. این گزینه فقط در سرور استفاده شده و در کلاینتها نادیده گرفته میشود. توجه داشته باشید که تنظیم این مورد روی رشته خالی آن را غیرفعال میکند.
- key=<filename>
- فایلی را برای دریافت کلید خصوصی کلاینت مشخص میکند. برای کلاینتها الزامی است و در سرور نادیده گرفته میشود.
- cert=<filename>
- فایلی را برای دریافت گواهی کلاینت مشخص میکند. برای کلاینتها الزامی است و در سرور نادیده گرفته میشود. در صورت عدم تعیین، انتظار میرود گواهی در فایل کلید باشد. تنظیم این مورد روی رشته خالی آن را غیرفعال میکند.
- username=<name>
- نام کاربری را برای احراز هویت در سمت راه دور مشخص میکند. این برای کلاینت الزامی است و در سرور نادیده گرفته میشود.
- service=<string>
- سرویس راه دور درخواستشده توسط کلاینت را تعیین میکند. اختیاری است، اما در صورت عدم ارائه ممکن است طرف مقابل اتصال را رد کند. در سرور نادیده گرفته میشود.
- password=<string>
- گذرواژه مورد استفاده برای احراز هویت با گذرواژه را مشخص میکند. این کار توصیه نمیشود، استفاده از کالبک امنتر است.
- mode=client|server
- به طور معمول یک gensio پذیرنده در حالت سرور و یک gensio متصلشونده در حالت کلاینت است. میتوان از این گزینه برای جابهجایی نقشها استفاده کرد.
- allow-authfail[=true|false]
- به طور معمول اگر گواهی سمت راه دور معتبر نباشد، certauth gensio اتصال را میبندد. این گزینه اجازه میدهد باز شدن اتصال با یک گواهی نامعتبر یا مفقود موفق شود. کاربر باید با استفاده از gensio_is_authenticated() احراز هویت را بررسی کند.
- use-child-auth[=true|false]
- اگر gensio فرزند احراز هویت شده باشد، پروتکل را اجرا نکن، مستقیماً به حالت passthrough برو و هیچ احراز هویتی انجام نده.
- enable-password[=true|false]
- در سرور، اجازه ورود با گذرواژه را بده. در کلاینت، در صورت درخواست، گذرواژه ارسال کن. گذرواژهها به طور پیشفرض غیرفعال هستند. استفاده از گذرواژهها بسیار کمتر از گواهیها امن است، بنابراین استفاده از آن توصیه نمیشود.
- require-password[=true|false]
- در سرور، حتی در صورت تأیید گواهیها، گذرواژه را نیز برای ورود الزامی کن. این مورد در سیستمهای ویندوزی که گذرواژه برای ورود تقریباً الزامی است اما همچنان احراز هویت با گواهی را میخواهید، مفید است.
- enable-2fa[=true|false]
- در سرور، دادههای احراز هویت دومرحلهای را از کلاینت درخواست کن. این تنها برای شرایطی مفید است که دادههای دومرحلهای قبل از شروع مشخص باشند، مانند Google Authenticator یا موارد مشابه. برای مواردی مانند پیامک/ایمیل که دادهها پس از شروع اتصال ارسال میشوند مناسب نیست.
- 2fa=<string>
- در کلاینت، در صورت درخواست سرور، دادههای احراز هویت دومرحلهای دادهشده را ارائه بده.
اعتبارسنجی Common Name انجام نمیشود. برنامه کاربردی باید این کار را انجام دهد؛ میتواند نام عمومی و سایر دادههای گواهی را از طریق یک رابط کنترلی دریافت کند. همچنین میتواند از نام کاربری دریافت شده از طریق رابط کنترلی استفاده نماید.
- con-timeout=<gtime>
- مهلت زمانی
برای تکمیل
یک اتصال را
تنظیم
میکند. اگر
فرایند
اتصال در
این مدت
زمان تکمیل
نشود،
اتصال قطع
خواهد شد.
پیشفرض ۶۰
ثانیه است.
به بخش "gtime"
مراجعه
کنید.
میتوانید از گواهیهای خودامضا در این رابط استفاده کنید. فقط از پیامدهای امنیتی آگاه باشید.
ماژول certauth gensio دارای ۴ کالبک اصلی مربوط به احراز هویت کاربر است. بسته به شرایط ممکن است فراخوانی شوند یا نشوند. اگر یک gensio را تخصیص دادهاید و در حال باز کردن هستید، رویدادهای عادی وارد میشوند. اگر از سمت یک accept میآید و هنوز هیچ gensio گزارش نشده است، رویدادهای _ACC_ وارد میشوند. در حالت _ACC_ مراقب باشید، از gensio دادهشده برای چیزی جز بررسی پارامترهای گواهی و نام کاربری استفاده نکنید و آن را ذخیره نکنید.
همه این فراخوانیها در صورتی که بخواهند احراز هویت فوراً موفق شود باید ۰، در صورت رد احراز هویت EKEYREJECTED، و در صورتی که بخواهند certauth آن بخش از احراز هویت را نادیده بگیرد ENOTSUP را بازگردانند؛ هر errno دیگر باعث قطع شدن اتصال میشود.
کالبکها عبارتند از:
- GENSIO_EVENT_AUTH_BEGIN / GENSIO_ACC_EVENT_AUTH_BEGIN
- در سمت سرور، هنگامی فراخوانی میشود که احراز هویت توسط کلاینت درخواست شود. اگر کاربر آن را از طریق GENSIO_CONTROL_USERNAME ارائه کرده باشد، نام کاربری در دسترس خواهد بود.
- GENSIO_EVENT_PRECERT_VERIFY / GENSIO_ACC_EVENT_PRECERT_VERIFY
- در سمت سرور، پس از دریافت گواهی اما قبل از اعتبارسنجی آن فراخوانی میشود. کاربر میتواند از این برای بررسی گواهی و بهروزرسانی مرجع گواهی بر اساس نام کاربری یا اطلاعات گواهی استفاده کند.
- GENSIO_EVENT_VERIFY_PASSWORD / GENSIO_ACC_EVENT_VERIFY_PASSWORD
- در سمت سرور، در صورتی که اعتبارسنجی گواهی ناموفق بوده و پس از درخواست گذرواژه از سمت راه دور فراخوانی میشود. گذرواژه به آن پاس داده شده و بلافاصله پس از این فراخوانی پاک میشود.
- GENSIO_EVENT_REQUEST_PASSWORD / GENSIO_ACC_EVENT_REQUEST_PASSWORD
- در سمت کلاینت، در صورتی که سرور درخواست ارسال گذرواژه کند و گذرواژه قبلاً برای gensio تنظیم نشده باشد، فراخوانی میشود. گذرواژه درخواستی بلافاصله پس از ارسال به سرور پاک میشود.
اطلاعات راه دور (Remote info)
ماژول certauth شناسه راه دور، آدرس راه دور و رشته راه دور را به gensio فرزند منتقل میکند.
mux
accepter = mux[(options)]
connecting = mux[(options)]
یک mux gensio یک فیلتر gensio است که امکان ایجاد یک یا چند کانال را روی یک gensio واحد فراهم کرده و اتصال را مالتیپلاکس (چندمنظوره) میکند. هر کانال دارای کنترل جریان کامل و مستقل است. کانالها همانطور که در بالا توضیح داده شد پیاممحور هستند و میتوان از یک mux بدون کانالهای اضافی صرفاً برای مرزبندی پیامها استفاده کرد. آنها همچنین از پیامهای خارج از باند پشتیبانی میکنند.
گزینهها (Options)
یک mux gensio گزینههای زیر را میپذیرد:
- max_channels=<n>
- حداکثر <n> کانال را برای ایجاد در mux مجاز میکند. پیشفرض 1000 است. حداقل مقدار <n> برابر با ۱ و حداکثر ۶۵۵۳۶ است.
- service=<string>
- سرویس راه دور درخواستشده توسط کلاینت را تنظیم میکند. اختیاری است، اما در صورت عدم ارائه ممکن است طرف مقابل اتصال را رد کند. در سرور نادیده گرفته میشود.
- mode=client|server
- به طور پیشفرض یک پذیرنده mux یک سرور است و یک متصلکننده mux یک کلاینت است. پروتکل تا حد زیادی متقارن است، اما اگر هر دو طرف تلاش کنند همزمان کارها را آغاز کنند شروع درست دشوار است. این گزینه به شما امکان میدهد در صورت نیاز خاص، حالت پیشفرض را لغو کنید.
هنگامی که باز شدن روی mux gensio کامل شد، درست مانند یک فیلتر شفاف با مرزبندی پیام کار خواهد کرد. در عمل، شما یک کانال باز دارید.
ایجاد کانالها (Creating Channels)
برای ایجاد یک کانال، تابع gensio_alloc_channel() را روی mux gensio فراخوانی کنید. این یک gensio جدید برمیگرداند که کانالی روی mux gensio است. میتوانید آرگومانهایی را که آرایهای از رشتهها هستند ارسال کنید؛ در حال حاضر readbuf, writebuf و service پذیرفته میشوند. سرویسی که در اینجا تنظیم میکنید روی کانال راه دور تنظیم میشود تا طرف مقابل بتواند آن را دریافت کند. کانال جدید باید قبل از استفاده با gensio_open() باز شود.
همانطور که حدس میزنید، طرف دیگر mux باید از کانال جدید مطلع شود. اگر یک طرف (هر طرفی، تفاوتی ندارد) gensio_alloc_channel() را فراخوانی کرده و سپس کانال جدید را باز کند، طرف دیگر یک رویداد GENSIO_EVENT_NEW_CHANNEL همانطور که در بخش جریانها و کانالها شرح داده شد دریافت خواهد کرد. میتوانید آن را با استفاده از هر کانال mux فراخوانی کنید. اولین عنصر در auxdata همان service است.
میتوانید مقدار service را پس از تخصیص کانال اما قبل از باز کردن آن تغییر دهید.
پیامهای خارج از باند (Out Of Band Messages)
ماژول mux از دادههای خارج از باند (oob) پشتیبانی میکند؛ دادههایی که به طور عادی تحویل داده میشوند. این در یک خواندن عادی اما با "oob" در auxdata میآید. میتوانید با افزودن "oob" به auxdata هنگام نوشتن داده oob ارسال کنید. معمولاً باید از پرچم "eom" استفاده کنید تا پایان پیامهای خارج از باند علامتگذاری شود.
این قابلیت برای این است که بتوانید دادههای ویژه را خارج از پردازش عادی دادهها ارسال کنید.
رویدادهای Mux (Mux Events)
رویدادهای عادی داده از طریق کانال gensio که با آن مرتبط هستند وارد میشوند. رویدادهای بستن نیز همینطور خواهند بود. اگر یک mux gensio به طور غیرعادی بسته شود (مانند قطع شدن اتصال زیرین)، روی هر کانال یک خطای خواندن دریافت خواهید کرد.
رویدادهای کانال جدید (و سایر رویدادهای سراسری که از gensioهای پایینی میآیند، مثلاً اگر روی ssl یا telnet اجرا میشوید) به طور معمول از طریق gensio اصلی وارد میشوند. با این حال، میتوانید آن را ببندید؛ کانال دیگری برای دریافت آن رویدادها انتخاب خواهد شد. به طور کلی، بهتر است رویدادهای سراسری را روی همه کانالها مدیریت کنید و پیشفرضی در نظر نگیرید.
بستن و آزادسازی یک Mux (Closing and Freeing a Mux)
برای بستن یک mux gensio، کافی است تمام کانالهای مرتبط با آن را ببندید. هیچ سازوکار بستن سراسری وجود ندارد (باور نمیکنید چه پیچیدگی عظیمی ایجاد میکند). هنگامی که یک mux gensio را بستید، میتوانید آن را مجدداً با gensio_open() باز کنید. این کار تمام کانالها را برای شما بازسازی نخواهد کرد؛ شما یک کانال خواهید داشت و کانالی که برای فراخوانی gensio_open() استفاده میکنید تبدیل به اولین کانال خواهد شد.
نمیتوانید کانالهای تکی را دوباره باز کنید.
برای آزادسازی (free کردن) یک mux gensio، باید تمام کانالهای روی آن را آزاد کنید.
pty
connecting = pty[(options)][,<program>]
یک pty ایجاد میکند و به صورت اختیاری برنامهای را در انتهای دیگر آن اجرا مینماید. با مشخص کردن یک برنامه، این حالت تا حدودی شبیه به stdio است، اما برنامه روی یک ترمینال اجرا میشود. تنها gensioهای متصلشونده پشتیبانی میشوند.
ماژول pty دارای رفتارهای ویژهای برای امکان اجرای شلهای لاگین کاربران از طریق root است.
در سیستمهای نوع یونیکس، اگر اولین نویسه برنامه '-' باشد، '-' از اجرای دستور حذف میشود اما در argv[0] باقی میماند. این کار باعث میشود یک شل به عنوان login shell عمل کند.
در سیستمهای نوع یونیکس، در فرایند منشعبشده، در صورتی که uid و guid مؤثر و واقعی متفاوت باشند، کد مربوطه uid و guid مؤثر (و ذخیرهشده) را روی uid و guid واقعی فعلی تنظیم میکند. به این ترتیب کاربر میتواند uid و gid واقعی را روی آنچه میخواهد برنامه تحت آن اجرا شود تنظیم کند، اما uid و gid مؤثر را روی مقادیر (احتمالاً root) نگه دارد تا بتوان پس از باز کردن pty آنها را به آن مقادیر بازگرداند. فهرست گروهها نیز روی گروههایی که شناسه کاربری واقعی در آنها قرار دارد تنظیم میشود. توجه داشته باشید که اگر شناسههای کاربری مؤثر و واقعی یکسان باشند، کاری انجام نمیشود.
در ویندوز، فرایند جدید در صورت تنظیم توکن جعل هویت (impersonation token)، روی کاربر موجود در آن توکن تنظیم میشود. در این حالت، فرایند جدید در یک گروه فرایند جدید اجرا خواهد شد. اگر توکن جعل هویت تنظیم نشده باشد، فرایند جدید به عنوان کاربر فرایند فراخواننده در همان گروه فرایند فراخواننده اجرا خواهد شد.
ماژول pty gensio از کنترل GENSIO_CONTROL_ENVIRONMENT برای امکان تنظیم محیط برای فرایند جدید پشتیبانی میکند. گزینه GENSIO_CONTROL_ARGS آرگومانها را به صورت یک آرایه argv تنظیم میکند. گزینه GENSIO_CONTROL_WIN_SIZE اندازه ترمینال را بر حسب نویسهها تنظیم میکند. گزینه GENSIO_CONTROL_START_DIR دایرکتوریای را که فرایند جدید در آن اجرا میشود تنظیم میکند.
اگر هیچ برنامهای مشخص نشده باشد، هنگامی که pty gensio باز میشود فقط pty را ایجاد میکند اما چیزی به آن متصل نخواهد کرد. برنامه دیگری میتواند pty را باز کند. میتوانید دستگاه pty پیرو (slave) را با دریافت رشته آدرس محلی به دست آورید.
گزینهها (Options)
علاوه بر readbuf، ماژول pty gensio گزینههای زیر را میپذیرد. این گزینهها تنها در صورتی مجاز هستند که pty متصلنشده (unattached) باشد. ترمینالهای pty که برنامههایی روی آنها اجرا میشوند باید از اصول استاندارد پیروی کنند.
- link=<filename>
- ایجاد یک پیوند نمادین (symlink) از filename به نام pty. به این ترتیب میتوانید یک مرجع ثابت برای اشاره به pty داشته باشید. مجوزهای استاندارد اعمال میشوند. بدون forcelink، در صورت وجود فایل filename، باز شدن با شکست مواجه میشود. فقط در یونیکس.
- forcelink[=true|false]
- در صورت تعیین link، اگر فایلی از قبل در محل پیوند نمادین وجود داشته باشد، آن را جایگزین کن. مراقب باشید، هر چه آنجا باشد را بدون تفکیک حذف میکند.
- start-dir=path
- زیربرنامه را به جای دایرکتوری فعلی در مسیر دادهشده شروع کن.
- raw[=true|false]
- باعث میشود pty در هنگام راهاندازی در حالت خام (raw) تنظیم شود. این برای هر چیزی که بلافاصله شروع به نوشتن روی pty میکند مهم است. اگر این را تنظیم نکنید، echo روشن خواهد بود و نوشتهها روی master بازتاب داده میشوند. به طور کلی، این برای ptyهای متصلنشده مفید است.
- umode=[0-7|[rwx]*]
- حالت فایل کاربر را برای pty slave تنظیم میکند. این همان ماسک بیتی معمولی read(4)/write(2)/execute(1) طبق chmod است، اما فقط برای بخش کاربر. اگر حالتی مشخص شود، سایر حالتها به طور پیشفرض "6" (rw) خواهند بود مگر اینکه مشخص شوند، و حالت نهایی توسط umask طبق اصول استاندارد نایکس تغییر مییابد. اگر حالتی مشخص نشود، روی مقدار پیشفرض تنظیم شده و تغییر نمیکند. توجه داشته باشید که گزینه perm در زیر احتمالاً راه بهتری برای تنظیم این مورد است.
- gmode=[0-7|[rwx]*]
- حالت فایل گروه را برای pty slave تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- omode=[0-7|[rwx]*]
- حالت فایل دیگران را برای pty slave تنظیم میکند، برای جزئیات به umode مراجعه کنید.
- perm=[0-7][0-7][0-7]
- حالت کامل را برای pty طبق اصول استاندارد نایکس تنظیم میکند که مانند عملیاتهای فوق توسط umask تغییر مییابد.
- owner=<name>
- مالک slave pty را روی کاربر دادهشده تنظیم میکند.
- group=<name>
- گروه slave pty را روی گروه دادهشده تنظیم میکند.
- user=<name>
- فقط در ویندوز، فرایند را تحت کاربر دادهشده به جای کاربر فرایند فراخواننده ایجاد کن. این کار عموماً نیازمند امتیازات ویژه است.
- passwd=<name>
- فقط در
ویندوز،
کاربر باید
برای
استفاده
مشخص شود.
با گذرواژه
دادهشده
وارد سیستم
کاربر شوید.
اگر
گذرواژه
داده نشود،
ورود S4U تلاش
خواهد شد،
اما ممکن
است چندان
خوب کار
نکند زیرا
برخی موارد
در access token کاربر
وجود ندارد.
نکته: ارسال گذرواژه به این روش مشکلات امنیتی قابل توجهی دارد. شما باید از مدیریت صحیح گذرواژه استفاده کنید. module=<name> فقط در ویندوز، کاربر باید برای استفاده مشخص شود. توکن کاربر جدید را با ماژول دادهشده بسازید. در صورت عدم تعیین، از "gensio" استفاده میشود.
رشته آدرس راه دور (Remote Address String)
رشته آدرس راه دور، برنامه و آرگومانهای اجراشده روی pty است. آرگومانها مجموعهای از رشتههای نقلقولشده با یک فاصله بین هر رشته خواهند بود، یکی برای هر آرگومان، با '"' در اطراف هر آرگومان، هر '"' در رشته به '\"' و هر '\' در رشته به '\\' تبدیل میشود.
آدرس راه دور (Remote Address)
آدرس اشارهگری به یک عدد صحیح است، توصیفگر فایل ptym بازگردانده میشود. هنگام ارسال باید addrlen روی sizeof(int) تنظیم شود.
رشته آدرس محلی (Local Address String)
این دستگاه مربوط به pty را بازمیگرداند، عموماً /dev/pts/<n>. این برای gensioهای pty بدون برنامه مفید است و به شما امکان میدهد مقدار را برای اتصال طرف دیگر به دست آورید. توجه داشته باشید که اگر یک pty gensio را ببندید و دوباره باز کنید، ممکن است رشته آدرس محلی متفاوتی دریافت کنید.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const char * const args[]" تخصیص مییابد.
msgdelim
accepter = msgdelim[(options)]
connecting = msgdelim[(options)]
یک جداکننده پیام (message delimiter) یک جریان غیرقابل اعتماد (مانند پورت سریال) را به یک رابط بستهای غیرقابل اعتماد تبدیل میکند. این اساساً برای این است که یک رابط بستهای قابل اعتماد مانند relpkt بتواند روی یک پورت سریال اجرا شود. این ماژول از جریان دادهها پشتیبانی نمیکند، بنابراین به خودی خود چندان کاربردی نیست.
پیامها با شروع پیام و پایان پیام مرزبندی میشوند و یک CRC16 در انتهای آنها وجود دارد.
این مورد اساساً برای استفاده روی پورتهای سریال و سایر جریانهایی است که میتوانند دادهها را مخدوش کنند. برای TCP و موارد مشابه از mux gensio استفاده کنید.
اندازه بافر پیشفرض ۱۲۸ بایت است که برای یک رابط پورت سریال با سرعت مناسب خوب است.
گزینهها (Options)
علاوه بر readbuf، ماژول msgdelim gensio گزینههای زیر را میپذیرد:
- writebuf=<n>
- اندازه بافر نوشتن را تعیین میکند.
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- crc[=on|off]
- بررسی CRC را در انتهای بسته فعال/غیرفعال میکند. اگر روی یک پروتکل قابل اعتماد اجرا میشوید و بهویژه برای آزمایش relpkt به طوری که بتوانید آن را فاز (fuzz) کرده و خطاهای crc را دور بزنید مفید است.
relpkt
accepter = relpkt[(options)]
connecting = relpkt[(options)]
یک رابط بستهای غیرقابل اعتماد (در حال حاضر فقط UDP و msgdelim) را به یک رابط بستهای قابل اعتماد تبدیل میکند. این به شما امکان میدهد یک اتصال قابل اعتماد روی یک پورت سریال (با msgdelim) یا UDP داشته باشید.
توجه داشته باشید که UDP توصیه نمیشود، زیرا کنترل جریان و موارد مشابه را به شکل مناسبی مدیریت نمیکند.
ماژول relpkt در برخورد با کلاینتها و سرورها رفتاری خاص دارد. پروتکل در اکثر موارد متقارن است؛ میتوانید دو کلاینت را شروع کنید و آنها به یکدیگر متصل خواهند شد، البته اگر در بازه زمانی نسبتاً نزدیکی شروع شوند تا از منقضی شدن مهلت زمانی یکی جلوگیری شود. یک سرور relpkt در هنگام باز شدن صرفاً برای همیشه منتظر یک اتصال ورودی میماند.
از آنجا که بستهمحور است، هنگام استفاده از relpkt به عنوان یک جریان ممکن است به chardelay gensio روی آن نیاز باشد تا نوشتههای کوچک منفرد را در یک گروه جمعآوری کرده و آن را کارآمدتر کند. اگر بایتهای منفرد بنویسید، بسیار ناکارآمد خواهد بود.
ماژول relpkt از readbuf پشتیبانی نمیکند. گزینههای زیر را میپذیرد:
- max_pktsize=<n>
- حداکثر اندازه یک بسته را تنظیم میکند. این مقدار ممکن است توسط سمت راه دور کاهش یابد، اما هرگز از آن فراتر نخواهد رفت. این مقدار باید حداقل ۵ بایت کوتاه تر از حداکثر اندازه بسته رابط زیرین آن باشد. پیشفرض ۱۲۳ است (حداکثر اندازه بسته msgdelim منهای ۵). اگر روی UDP اجرا شود، برای کارایی احتمالاً باید این مقدار افزایش یابد.
- max_packets=<n>
- حداکثر تعداد بستههای معلق را تعیین میکند. این مقدار ممکن است توسط سمت راه دور کاهش یابد، اما هرگز از آن فراتر نخواهد رفت.
- mode=client|server
- به طور پیشفرض relpkt روی یک پذیرنده یک سرور و روی یک متصلکننده یک کلاینت است. به توضیحات بالا در مورد کلاینتها و سرورها مراجعه کنید.
- timeout=<gtime>
- زمان مهلت زمانی را مشخص میکند. اگر relpkt پیامی ارسال کند که نیازمند ack باشد، این مدت زمان را قبل از ارسال مجدد بسته منتظر میماند. برای اطلاعات بیشتر در مورد نحوه تنظیم زمان به بخش "gtime" مراجعه کنید. اگر پسوندی برای واحد زمانی مشخص نکنید، پیشفرض ثانیه است. پیشفرض ۱ ثانیه است.
- max_timeouts=<n>
- حداکثر تعداد دفعات رخ دادن مهلت زمانی قبل از صرفنظر کردن از اتصال. پیشفرض ۵ است.
ratelimit
accepter = ratelimit[(options)]
connecting = ratelimit[(options)]
نرخ ارسال دادههای عبوری از این فیلتر gensio را محدود میکند. تعدادی بایت مجاز به عبور میشوند، سپس ارسال تا زمانی که تأخیر دادهشده سپری شود به تعویق میافتد. دریافت در حال حاضر محدودیت نرخ ندارد، اما ممکن است در آینده اضافه شود. گزینه readbuf در حال حاضر در این gensio موجود نیست.
گزینهها (Options)
ماژول ratelimit gensio گزینههای زیر را میپذیرد:
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- xmit_len=<n>
- تعداد بایتهای مجاز قبل از اعمال تأخیر. توجه داشته باشید که تأخیر پس از موفقیت یک نوشتن واحد رخ میدهد، بنابراین اگر یک بایت واحد نوشته شود تأخیر ایجاد خواهد شد. اگر نوشتنی بیش از این طول انجام شود، به این طول محدود خواهد شد. پیشفرض یک است.
- xmit_delay=<gtime>
- میزان زمان انتظار بین نوشتنها. برای اطلاعات در مورد این مشخصه زمانی به بخش "gtime" مراجعه کنید. این مقدار باید ارائه شود.
chardelay
accepter = chardelay[(options)]
connecting = chardelay[(options)]
نویسههای در حال ارسال را جمعآوری کرده و آنها را تا زمانی که مقدار مشخصی زمان سپری شود، تعداد مشخصی نویسه دریافت شود، یا به صورت اختیاری یکی از مجموعهای از رشتهها ارسال شود، نگه میدارد.
توجه داشته باشید که این فقط برای دادههای ارسالی اعمال میشود. دادههای دریافتشده به صورت شفاف عبور داده میشوند. گزینه readbuf در این gensio در دسترس نیست.
گزینهها (Options)
ماژول chardelay gensio گزینههای زیر را میپذیرد:
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- min-delay=<gtime>
- پس از دریافت یک نویسه، به میزان زمان دادهشده تا ارسال نویسههای ذخیرهشده منتظر بمان. یک نویسه جدید این تایمر را بازنشانی میکند، بنابراین اساساً این مقدار زمانی را تعیین میکند که هیچ نویسهای قبل از ارسال محتوای بافر ارسال نشده باشد. پیشفرض ۱ میلیثانیه است.
- max-delay=<gtime>
- حداکثر زمان پس از دریافت یک نویسه قبل از ارسال بافر نوشتن را تعیین میکند. این مقدار با نویسههای جدید بازنشانی نمیشود، بنابراین تضمین میشود که هر نویسه اضافهشده به بافر نوشتن پس از این تأخیر ارسال شود. پیشفرض ۲۰ میلیثانیه است.
- writebuf=<n>
- اندازه بافر خروجی. هنگامی که این تعداد نویسه در بافر نوشتن صفبندی شوند، بافر فوراً ارسال میشود. پیشفرض 1024 است.
- sendon=<str>
- این یک یا چند رشته است که با نویسههای فاصله از هم جدا شدهاند و باعث میشوند بافر فوراً ارسال شود. این یک رشته استاندارد شبیه به C است. توجه داشته باشید که نویسه فاصله تنها نویسهای است که رشتهها را از هم جدا میکند. Tab، خط جدید و غیره جداکننده نیستند. اگر میخواهید یک فاصله بفرستید، باید از دو نویسه \ برای اسکیپ کردن آن استفاده کنید. توجه داشته باشید که این فقط یک مقایسه ساده انجام میدهد و ماشین حالت متناهی یا چیزی شبیه به آن تولید نمیکند، بنابراین رشتههای درون رشتهها ممکن است نادیده گرفته شوند.
مثالها (EXAMPLES)
فرض کنید موارد زیر را داریم:
- chardelay(min-delay=5s,max-delay=10s,sendon="\r \\ \n")
این بدان معناست که اگر یک نویسه ارسال شود، ۵ ثانیه تا ارسال آن نویسه منتظر میماند، مگر اینکه نویسه دیگری در آن زمان دریافت شود که در این صورت تایمر ۵ ثانیهای مجدداً راهاندازی میشود. با این حال، آن نویسه در هر صورت ظرف ۱۰ ثانیه ارسال خواهد شد. اگر یک carriage return (\r)، یک خط جدید (\n) یا یک نویسه فاصله (به دابل \ همانطور که در بالا بحث شد توجه کنید) ارسال شود، هر آنچه در بافر است فوراً ارسال میشود.
trace
accepter = trace[(options)]
connecting = trace[(options)]
یک gensio شفاف که اجازه میدهد دادههای عبوری از آن به یک فایل ارسال شوند. برای اشکالزدایی مفید است. همچنین میتواند دادهها را در هر دو جهت مسدود کند.
توجه داشته باشید که trace gensio با گزینه dir تنها دادههایی را چاپ میکند که توسط طرف دیگر پذیرفته شده باشد. بنابراین، برای نمونه، اگر trace gensio مقدار ۱۰۰ بایت داده خواندهشده دریافت کند، آن را فوراً به gensio بالاتر تحویل میدهد. اگر آن فقط ۴۰ بایت را بپذیرد، trace فقط ۴۰ بایت را چاپ میکند و تنها ۴۰ بایت را از gensio پایینتر میپذیرد. همین موضوع برای دادههای ارسالی نیز صادق است. اگر میخواهید دادهها را قبل از تحویل به gensio/کاربر بالا/پایین ببینید، از گزینه b4dir استفاده کنید، اما به یاد داشته باشید که ممکن است تمام دادهها پذیرفته نشوند. میتوانید از dir و b4dir به طور همزمان استفاده کنید.
گزینهها (Options)
ماژول trace از readbuf پشتیبانی نمیکند. گزینههای زیر را میپذیرد:
- dir=none|read|write|both
- تعیین میکند چه دادههایی ردیابی (trace) شوند. مقدار "none" به این معنی است که دادهای ردیابی نمیشود (پیشفرض)، مقدار "read" دادههای جاری به سمت بالای پشته gensio را ردیابی میکند (خواندهشده توسط والد)، مقدار "write" دادههای جاری به سمت پایین پشته gensio را ردیابی میکند (نوشتهشده توسط والد)، و "both" هر دو خواندن و نوشتن را ردیابی میکند.
- b4dir=none|read|write|both
- مانند dir است، اما دادهها را قبل از فراخوانی گرداننده (handler) با تمام دادههای ارائهشده به خروجی ردیابی میکند. همانطور که در بالا ذکر شد ممکن است تمام دادهها پذیرفته نشوند، اما به شما امکان میدهد دادهها را قبل از handler ببینید تا در صورت نیاز مفید باشد.
- block=none|read|write|both
- دادهها را در یک یا هر دو جهت مسدود میکند. "none" یعنی دادهها در هر دو جهت جریان دارند (پیشفرض)، "read" یعنی دادههای جاری به سمت بالای پشته gensio دور ریخته میشوند، "write" یعنی دادههای جاری به سمت پایین پشته gensio دور ریخته میشوند، و "both" هر دو خواندن و نوشتن را دور میریزد. دادههایی که دور ریخته میشوند ردیابی نمیشوند.
- raw[=yes|no]
- در صورت تنظیم، دادههای ردیابیشده به صورت بایتهای خام نوشته میشوند. در صورت عدم تنظیم، دادههای ردیابیشده در قالبی خوانا برای انسان نوشته خواهند شد.
- file=<filename>
- نام فایلی که دادههای ردیابی باید در آن نوشته شوند. در صورت عدم ارائه، ردیابی غیرفعال است. توجه داشته باشید که مگر اینکه delold مشخص شده باشد، فایل در حالت الحاق (append) باز میشود، بنابراین دادههای ردیابی جدید را به انتهای یک فایل موجود اضافه میکند.
- stderr[=yes|no]
- ارسال خروجی ردیابی به خطای استاندارد. بر file اولویت دارد.
- stdout[=yes|no]
- ارسال خروجی ردیابی به خروجی استاندارد. بر file و stderr اولویت دارد.
- delold[=yes|no]
- حذف دادههای قدیمی در فایل به جای الحاق به فایل.
perf
accepter = perf[(options)]
connecting = perf[(options)]
یک gensio برای اندازهگیری توان عملیاتی (throughput) یک اتصال. این امکان اندازهگیری عملکرد یک اتصال را فراهم میکند. هیچ دادهای را عبور نمیدهد؛ در عوض، دادههای خام را به لایه پایینتر مینویسد (اگر write_len تنظیم شده باشد) و دادهها را از لایه پایینتر میخواند، بایتها را میشمارد و زمان را اندازهگیری میکند.
برای لایه بالایی، perf آمارهایی را در مورد انتقال داده چاپ میکند. تعداد بایتهای نوشتهشده و خواندهشده در هر ثانیه را چاپ میکند و در انتها مجموع کل را نمایش میدهد.
اگر write_len و/یا expect_len غیر صفر باشند، هنگامی که فیلتر دادههای نوشتنی را تمام کند و تمام دادههای مورد انتظار را دریافت کرده باشد، GE_REMCLOSE را بازمیگرداند. اگر هر دو صفر باشند، اتصال توسط gensio بسته نخواهد شد.
گزینهها (Options)
ماژول perf از readbuf پشتیبانی نمیکند. گزینههای زیر را میپذیرد:
- writebuf=<n>
- اندازه بافر را برای نوشتن در gensio فرزند تنظیم میکند. هر نوشتن به این اندازه خواهد بود. پیشفرض صفر است.
- write_len=<n>
- تعداد بایتها برای نوشتن.
- expect_len=<n>
- تعداد بایتهای مورد انتظار از سمت دیگر.
conacc
accepter = conacc[(options)],<gensio string>
ماژول conacc یک پذیرنده gensio است که یک gensio را به عنوان فرزند دریافت میکند. هنگامی که پذیرنده شروع به کار میکند، gensio فرزند را باز میکند. هنگامی که gensio فرزند باز شدن را تمام کرد، یک فرزند جدید را برای پذیرنده گزارش میدهد. gensio گزارششده میتواند به طور عادی استفاده شود.
هنگامی که gensio بسته شد، با تکمیل فرایند بستن، پذیرنده تلاش خواهد کرد بلافاصله gensio را دوباره باز کند و در صورت شکست اتصال خود را غیرفعال خواهد کرد، مگر اینکه retry-time تنظیم شده باشد. این بدان معناست که اگر gensio دارای نوعی آدرس تصادفی باشد (مانند یک pty یا یک آدرس tcp با پورت تنظیمشده روی صفر)، میتوانید آدرس متفاوتی برای gensio دوباره باز شده دریافت کنید. بنابراین در این حالت باید آدرس محلی یا پورت محلی را مجدداً دریافت کنید.
گزینهها (Options)
گزینه readbuf پذیرفته نمیشود.
- retry-time=<gtime>
- به جای راهاندازی مجدد فوری اتصال بستهشده، این گزینه باعث ایجاد تأخیر بین بستن و باز کردن مجدد میشود. همچنین اگر اتصال با شکست مواجه شود، خود را غیرفعال نخواهد کرد، بلکه دوره retry-time دیگری را منتظر میماند و دوباره اتصال را امتحان میکند. به بخش gtime در بالا مراجعه کنید. پیشفرض واحد میلیثانیه است. مقدار پیشفرض صفر است.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const char *" تخصیص مییابد؛ که همان مشخصات gensio زیرین آن است.
mdns
connecting = mdns[(options)][,<name>]
این gensio از mDNS برای یافتن یک سرویس استفاده میکند و سپس تلاش مینماید به آن متصل شود. این میتواند بسیار راحت باشد؛ نوع اتصال، آدرس و پورت را برای شما پیدا میکند و در صورت وجود به طور خودکار telnet و rfc2217 را اضافه میکند. نام mDNS را میتوان به عنوان یک گزینه یا به عنوان رشته پس از کاما که در بالا نشان داده شده است تنظیم کرد.
رشتههای name، type، host و domain را میتوان به روشهای مختلف با نویسههای عام (wildcard) مشخص کرد. برای جزئیات به "STRING VALUES FOR WATCHES" در gensio_mdns(3) مراجعه کنید.
گزینهها (Options)
گزینه readbuf پذیرفته میشود، اما در صورت عدم تعیین، مقدار پیشفرض readbuf برای زیر-gensio در نظر گرفته خواهد شد. علاوه بر readbuf، ماژول mdns gensio گزینههای زیر را میپذیرد:
- nostack[=true|false]
- به طور پیشفرض mdns gensio تلاش میکند از رشته متنی "gensiostack" از سرویس mDNS استفاده کند. اگر نمیخواهید این کار را انجام دهد، تنظیم این گزینه آن را خاموش میکند.
- ignore-v6-link-local[=true|false]
- آدرسهای پیوند-محلی (link-local) در IPv6 را نادیده بگیر، مواردی که با "fe80:" شروع میشوند. آنها در برخی سیستمها مشکل ایجاد میکنند.
- mdnstimeout=<gtime>
- میزان زمان انتظار برای mdns جهت یافتن آیتم را تنظیم میکند. برای اطلاعات بیشتر در مورد نحوه تنظیم زمان به بخش "gtime" مراجعه کنید. واحد پیشفرض میلیثانیه، و زمان پیشفرض ۱ ثانیه است. تنظیم پیشفرض برای mdnstimeout یک gtime نیست، بلکه یک عدد صحیح به میلیثانیه است. همچنین میتوانید به جای "mdnstimeout" از "timeout" استفاده کنید، اما نه در پیشفرض.
- name=<mdnsstr>
- نام mdns را برای جستجو تنظیم میکند. شما عموماً میخواهید این را تنظیم کنید، در غیر این صورت اولین موردی را که از جستجو به دست میآید دریافت خواهید کرد.
- type=<mdnsstr>
- نوع mdns را برای جستجو تنظیم میکند.
- domain=<mdnsstr>
- دامنه mdns را برای جستجو تنظیم میکند. عموماً از این استفاده نمیکنید.
- host=<mdnsstr>
- میزبان mdns را برای جستجو تنظیم میکند. عموماً از این استفاده نمیکنید.
- txt=<key>:<value>
- سرویس را ملزم میکند که یک رکورد TXT منطبق با کلید و مقدار دادهشده داشته باشد. این یک تطابق دقیق در برابر ورودی استاندارد mDNS TXT به صورت key=value است. میتوانید این گزینه را چندین بار مشخص کنید؛ تمام ورودیهای TXT مشخصشده باید روی همان سرویس وجود داشته باشند.
- interface=<num>
- شماره رابط شبکه را برای جستجو روی آن تنظیم میکند. پیشفرض -1 است که به معنای تمام رابطها میباشد.
- nettype=unspec|ipv4|ipv6
- نوع شبکه برای جستجو. unspec یعنی هر نوعی، در غیر این صورت میتوانید انتخاب کنید که به ipv4 و ipv6 محدود شود.
- nodelay[=true|false]
- گزینه nodelay را روی سوکت تنظیم میکند. این مورد برای udp نادیده گرفته میشود. توجه داشته باشید که مقدار پیشفرض برای mdns نادیده گرفته میشود؛ اگر آن را در اینجا تنظیم نکنید، مقدار پیشفرض زیر-gensio انتخابشده را خواهد گرفت.
- laddr=<addr>
- یک مشخصه آدرس برای bind شدن روی سوکت محلی جهت تنظیم آدرس محلی.
تخصیص مستقیم (Direct Allocation)
به عنوان یک terminal gensio با gdata به صورت "const char *" تخصیص مییابد؛ که مشخصات mdns به عنوان یک رشته است.
kiss
accepter = kiss[(options)]
connecting = kiss[(options)]
یک gensio که پروتکل رادیو آماتوری KISS را برای انتقال داده بین TNC و AX25 پیادهسازی میکند. برای جزئیات به http://www.ax25.net/kiss.aspx مراجعه کنید. این پروتکل شامل تعدادی پارامتر قابل تنظیم است، احتمالاً نباید با بیشتر آنها سر و کله بزنید.
این یک رابط بستهمحور معمولی است.
پروتکل KISS از چندین TNC در زیر خود پشتیبانی میکند. برای نوشتن در یک TNC خاص، باید از رشته auxdata به صورت "tnc:<n>" در هنگام نوشتن استفاده کنید. اگر آن را تنظیم نکنید، TNC صفر فرض میشود. در هنگام خواندن، "tnc:<n>" همیشه در یکی از فیلدهای auxdata خواهد بود. نباید TNC بزرگتر از تعداد TNCهای پیکربندیشده تنظیم کنید.
یک فیلد پروتکل ۸ بیتی در فریم AX25 وجود دارد که PID نامیده میشود. این در دادهها ارسال نمیشود، بلکه در auxdata با قالب "pid:<n>" قرار دارد. و برای تنظیم pid، آن را در هنگام نوشتن در auxdata ارسال کنید. اگر pid را تنظیم نکنید، پیشفرض 240 (0xf0) است.
گزینهها (Options)
پروتکل kiss از گزینههای زیر پشتیبانی میکند:
- readbuf=<n>
- حداکثر اندازه بستهای را که میتوان از TNC خواند تنظیم میکند. پیشفرض 256 است.
- writebuf=<n>
- حداکثر اندازه بستهای را که میتوان در TNC نوشت تنظیم میکند. پیشفرض 256 است.
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- tncs=<n>
- تعداد TNCهای پشتیبانیشده. پیشفرض ۱ است.
- server[=yes|no]
- تعیین میکند آیا این یک سرور KISS است یا کلاینت. یک کلاینت پارامترهای قابل تنظیم را روی TNC تنظیم میکند. انتظار میرود سرور یک TNC باشد، اما این هنوز به طور کامل پیادهسازی نشده است زیرا نمیتوانید پارامترهای قابل تنظیم را دریافت کنید.
- setupstr=<string>
- رشته دادهشده را در هنگام راهاندازی برای آمادهسازی دستگاه ارسال کن.
- setup-delay=<n milliseconds>
- پس از ارسال رشته setup، قبل از ادامه عملیات به تعداد میلیثانیه دادهشده منتظر بمان.
- d710[=yes|no]
- در صورت تنظیم روی yes یا فقط ارائه "d710"، مقدار setupstr را برای رادیوی Kenwood D710 تنظیم میکند. این معادل اجرای دستور زیر است: setupstr='xflow on\rhbaud 1200\rkiss on\rrestart\r'
- d710-9600[=yes|no]
- در صورت تنظیم روی yes یا ارائه "d710-9600"، مقدار setupstr را برای رادیوی Kenwood D710 در 9600 bps تنظیم میکند. این معادل است با: setupstr='xflow on\rhbaud 9600\rkiss on\rrestart\r'
- txdelay=<n>
- پارامتر txdelay در KISS به میلیثانیه، گردشده به نزدیکترین توان ده. حداکثر مقدار 2550 است. پیشفرض 50ms است.
- persist=<n>
- پارامتر "P" در KISS، در محدوده ۰-۲۵۵. مشخصات آن کاملاً شفاف نیست. پیشفرض 63 است.
- slottime=<n>
- پارامتر slot time در KISS به میلیثانیه، گردشده به نزدیکترین توان ۱۰. حداکثر مقدار 2550ms و پیشفرض 100ms است.
- fullduplex[=yes|no]
- اتصال را به صورت دوطرفه کامل (full duplex) تنظیم میکند.
- sethardware=<n>
- یک مقدار کنترلی مخصوص سختافزار در محدوده ۰-۲۵۵. معنای آن به سختافزار بستگی دارد. به طور پیشفرض تنظیم نشده است.
ax25
accepter = ax25[(options)]
connecting = ax25[(options)]
یک gensio که پروتکل رادیو آماتوری AX25 را برای انتقال داده پیادهسازی میکند. شما عموماً این را روی یک kiss gensio اجرا میکنید. برای جزئیات به http://www.ax25.net مراجعه کنید.
این یک رابط بستهمحور استاندارد است.
همچنین یک پیادهسازی مبتنی بر کانال است. هر اتصال AX25 به یک سیستم راه دور به عنوان یک کانال پیادهسازی میشود. همچنین اگر فقط میخواهید فریمهای UI را دریافت کنید، میتوانید یک کانال غیرمتصل (unconnected channel) داشته باشید.
هیچ تنظیم سرور/کلاینت روی ax25 gensio وجود ندارد. پروتکل متقارن است، بنابراین نیازی نیست. یک پذیرنده ax25 اولین اتصالی را که وارد میشود میگیرد و آن را به عنوان gensio تحویل میدهد، اما پس از آن واقعاً تفاوتی وجود ندارد.
هنگام اجرا به عنوان یک پذیرنده، اتصالات ورودی به عنوان اتصالات جدید تحویل داده میشوند، نه کانالهای جدید. این به شما امکان میدهد از یک ax25 gensio به شکل طبیعیتری در زیر یک سرور بدون نیاز به اطلاع از ax25 در کد استفاده کنید. برای نمونه، برای ایجاد یک سرور AX25 ساده که تمام دادههای ورودی را بازتاب میدهد، میتوانید یک رفلکتور ایجاد کنید:
- greflector -t kiss,tcp,1234
سپس میتوانید سرور را بسازید:
- gensiot -i 'echo' --server -a \
'ax25(laddr=test-1),conacc,kiss,tcp,localhost,1234'
سپس میتوانید به آن متصل شوید:
- gensiot 'ax25(laddr=test-2,addr="0,test-1,test-2"),kiss,tcp,localhost,1234'
بنابراین برای استفاده از این، یک ax25 gensio تخصیص دهید. اگر میخواهید اتصال برقرار کنید، باید addr را روی یک آدرس مقصد تنظیم کنید. به طور پیشفرض در صورت ارائه addr، مقدار laddr از روی addr تنظیم میشود. اگر فقط فریمهای UI میخواهید، نیازی به تنظیم آدرس ندارید (در ادامه بیشتر توضیح داده میشود). سپس gensio را باز میکنید. یک ax25 gensio بدون آدرس فوراً باز میشود و شروع به دریافت بستههای UI طبق دستورالعمل میکند. با تنظیم addr، تلاش میکند اتصال برقرار کند. هنگامی که اتصال برقرار شد (یا شکست خورد)، کالبک باز شدن فراخوانی میشود.
آدرسهای AX25 (AX25 Addresses)
یک رشته آدرس gensio AX25 به این صورت است:
- [ax25:]tncport,dest[:c|r],src[:c|r][,extra1[:h]
[,extra2[:h][..]]]
tncport عددی از ۰ تا ۱۵ است که مشخص میکند از کدام TNC استفاده شود. dest و src زیرآدرسهایی هستند که آدرسهای مقصد و مبدأ را مشخص میکنند. توجه داشته باشید که آدرس مبدأ بهتر است با یک laddr مطابقت داشته باشد، وگرنه اتصال کار نخواهد کرد. فیلدهای extra نیز زیرآدرس هستند. اینها برای مسیریابی (قابلیتی که منسوخ شده و دیگر استفاده نمیشود) و توسط APRS برای اهداف خودش استفاده میشوند، برای جزئیات به مشخصات APRS مراجعه کنید. مقادیر c, r, و h بیتهایی در آدرس هستند که معمولاً برای شما اهمیتی ندارند، به جز فیلد h برای APRS.
زیرآدرسها به این صورت هستند:
- callsign-n
که در آن callsign مجموعهای از نویسههای حرفیعددی (a-zA-Z0-9) است و n عددی بین ۰ تا ۱۵ است. نویسههای کوچک در آدرس به حروف بزرگ تبدیل میشوند و در هنگام دریافت به حالت قبل برگردانده نمیشوند.
مدیریت بستههای متصلنشده (UI frames)
برای دریافت فریمهای UI، باید کنترل GENSIO_CONTROL_ENABLE_OOB را روی gensio فعال کنید. اگر مقدار را روی ۱ تنظیم کنید، فریمهای UI را که در آنها مقصد با یکی از laddrs شما مطابقت دارد دریافت خواهید کرد. اگر آن را روی ۲ تنظیم کنید، تمام فریمهای UI را دریافت خواهید کرد (حالت بیقید یا promiscuous mode). مقدار ۰ دریافت فریمهای UI را غیرفعال میکند.
فریمهای UI با "oob" در auxdata گزارش میشوند، مانند دادههای خارج از باند. توجه داشته باشید که باید تمام فریم UI را به طور کامل در همان فراخوانی مدیریت کنید. اگر تمام دادهها را مصرف نکنید، دیگر فراخوانی نخواهد شد.
میتوانید کانالی داشته باشید که هم دادههای متصل و هم فریمهای UI را دریافت کند، اما معمولاً برای دریافت فریمهای UI یک کانال جداگانه بدون addr تنظیمشده خواهید داشت. اگر فیلد laddr را تنظیم نکنید، آن کانال فقط برای حالت بیقید (promiscuous) قابل استفاده است.
در بستههای دریافتشده، auxdata شامل فیلدی خواهد بود که با "addr:" شروع میشود و بقیه آن آدرس gensio AX25 در بسته است. هنگام ارسال یک فریم UI، باید فیلدهای "oob" و "addr:" را در auxdata با یک آدرس معتبر در فیلد "addr:" تنظیم کنید.
دادههای خام (Raw Data)
اگر گزینه raw را تنظیم کنید، دادههای خام در کالبک خواندن همانطور که در اسناد گزینه توضیح داده شده گزارش میشوند. اگر هنگام نوشتن در کانال یک auxdata با مقدار "raw" تنظیم کنید، دادههای خامی را که ارائه میدهید ارسال میکند. یک CRC اضافه خواهد شد، اما هیچ چیز دیگری اضافه نمیشود.
گزینهها (Options)
مقادیر گزینهها برای کانالها همگی از گزینههای استفادهشده برای ایجاد اولین کانال به ارث برده میشوند، به جز addr (که در صورت تمایل باید برای هر کانال ارائه شود) و laddr (که فقط در اولین کانال استفاده میشود). ماژول ax25 از گزینههای زیر پشتیبانی میکند:
- readbuf=<n>
- حداکثر اندازه بستهای را که میتوان خواند تنظیم میکند. پیشفرض 256 است.
- writebuf=<n>
- حداکثر اندازه بستهای را که میتوان نوشت تنظیم میکند. پیشفرض 256 است.
- outgen=<str>
- اجازه میدهد یک پشته gensio خروجی متفاوت برای خروجی مشخص شود. خروجی را در این gensio مینویسد و از فرزند دیگر فقط برای ورودی استفاده میکند. این مورد فقط میتواند روی gensio اولیه تنظیم شود، نه زیرکانالها، و فقط روی gensioهای متصلشونده.
- readwindow=<n>
- حداکثر اندازه بستهای را که میتوان بدون تأییدیه دریافت کرد تنظیم میکند. پیشفرض ۷ برای حالت گسترشیافته (extended) و ۴ برای غیرگسترشیافته است.
- writewindow=<n>
- حداکثر تعداد بستههایی را که میتوان بدون تأییدیه به سمت راه دور ارسال کرد تنظیم میکند. پیشفرض ۷ برای حالت گسترشیافته و ۴ برای غیرگسترشیافته است.
- extended=<n>
- حالت
گسترشیافته
را تنظیم
میکند.
تنظیم آن
روی ۱
شمارههای
توالی ۷
بیتی را
فعال
میکند؛
اتصال
ابتدا تلاش
میکند از
شماره
توالی ۷
بیتی
استفاده
کند. اگر
شکست
بخورد، به
شمارههای
توالی ۳
بیتی
برمیگردد.
تنظیم مقدار روی ۲ یک عملیات غیر استاندارد را فعال میکند که مذاکره پارامتر را به راهاندازی اتصال اضافه میکند. تنظیم readbuf، writebuf، readwindow و writewindow بدون extended=2 واقعاً چندان مفید نیست زیرا بدون مذاکره مجبور به بازگشت به پیشفرضها خواهد شد. اگر extended=2 شکست بخورد، به extended=1 برمیگردد.
- laddr=<subaddr>[;<subaddr[...]]
- آدرسهایی
را تنظیم
میکند که ax25
gensio اتصالات
را روی
آنها
دریافت
خواهد کرد.
به جز برای
فریمهای UI
و حالت خام،
مقصد یک
بسته باید
با یکی از
این
آدرسها
مطابقت
داشته باشد
تا مدیریت
شود. این
گزینه فقط
روی
پذیرنده یا
اولین
اتصال قابل
تنظیم است و
برای همه
کانالها
اعمال
میشود.
این موارد را میتوان با کنترلهای GENSIO_CONTROL_ADD_LADDR و GENSIO_CONTROL_DEL_LADDR نیز اضافه و حذف کرد.
- uiaddr=<subaddr>[;<subaddr[...]]
- آدرسها را
برای
کانالی که
آدرسهای UI
را دریافت
میکند
تنظیم
میکند. اگر
در حالت UI
بیقید
نباشد، فقط
فریمهای UI
ارسالشده
به
آدرسهای
این فهرست
را دریافت
میکند. این
موارد را
میتوان با
کنترلها
نیز اضافه
کرد.
این موارد را میتوان با کنترلهای GENSIO_CONTROL_ADD_MCAST و GENSIO_CONTROL_DEL_MCAST نیز اضافه و حذف کرد.
- addr=<ax25addr>
- آدرس سمت راه دور اتصال را تنظیم میکند. بستهها به این آدرس ارسال خواهند شد.
- crc[=yes|no]
- فعالسازی بررسی CRC. پیشفرض off است.
- ign_emb_ua[=yes|no]
- برخی پشتههای AX.25 هنگامی که یک SABM دوم دریافت میکنند (به دلیل timeout) به درستی خود را بازنشانی نمیکنند، اما همچنان یک UA ارسال مینمایند. اگر خطاهایی درباره دریافت UA در حین اتصال دریافت میکنید و اتصال معلق میماند، فعال کردن این گزینه را امتحان کنید.
- srt=<n>
- زمان رفت و برگشت هموارشده (SRTT) اولیه برای اتصال، به میلیثانیه. برای جزئیات به مشخصات مراجعه کنید، احتمالاً نیازی به دستکاری آن ندارید. توجه داشته باشید که این مقداری که در اینجا تنظیم میکنید برای مقدار واقعی در تعداد digipeaterهای بین مبدأ و مقصد ضرب میشود. پیشفرض 1500 است.
- t2=<n>
- مقدار تایمر ۲ برای اتصال، به میلیثانیه. پیشفرض ۲ ثانیه است.
- t3=<n>
- مقدار تایمر ۳ برای اتصال، به میلیثانیه. پیشفرض 300 ثانیه است.
- retries=<n>
- تعداد تلاشهای مجدد در ارسال قبل از صرفنظر کردن و قطع اتصال. پیشفرض 10 است.
- heard[=yes|no]
- هنگامی که هر بستهای از TNC شنیده شد، آدرس را در کالبک خواندن گزارش بده. دادهای وجود نخواهد داشت، و فیلدهای "oob"، "heard" و "addr:" در auxdata خواهند بود. توجه داشته باشید که اگر خواندن را غیرفعال کنید، هر گزارش شنیدهشدهای که وارد شود دور ریخته میشود و گزارش نخواهد شد. هر بسته UI گزارششده به عنوان بسته شنیدهشده گزارش نمیشود؛ شما تمام اطلاعات مورد نیاز را در گزارش UI دارید.
- raw[=yes|no]
- هنگامی که هر بستهای از TNC شنیده شد، دادههای خام را در کالبک خواندن گزارش بده. این کل بسته است، شامل آدرس، اما بدون CRC. فیلدهای "oob" و "raw" در auxdata خواهند بود. توجه داشته باشید که اگر خواندن را غیرفعال کنید، هر گزارش خامی که وارد شود دور ریخته شده و گزارش نخواهد شد.
xlt
accepter = xlt[(options)]
connecting = xlt[(options)]
یک gensio که نویسهها را ترجمه و تبدیل میکند. این اساساً برای تبدیل line feedها و carriage returnها است، اما ممکن است در نهایت برای انجام جایگزینی رشتهها و موارد مشابه گسترش یابد.
گزینه readbuf در این gensio موجود نیست.
گزینهها (Options)
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- in=<n>:<m>
- تبدیل نویسه n (یک عدد، 0xnn برای هگزادسیمال، 0nnn برای هشتهشتی، یا nn برای دهدهی) به نویسه m در دادههای خواندهشده از gensio.
- out=<n>:<m>
- شبیه به in، اما تبدیل نویسه n به نویسه m روی دادههای نوشتهشده در gensio.
- nlcr
- تبدیل خطوط جدید به carriage return در دادههای خواندهشده از gensio، و تبدیل carriage return به خطوط جدید در دادههای نوشتهشده در gensio.
- crnl
- تبدیل carriage return به خطوط جدید در دادههای خواندهشده از gensio، و تبدیل خطوط جدید به carriage return در دادههای نوشتهشده در gensio.
keepopen
connecting = keepopen[(options)]
یک فیلتر gensio که باعث میشود برای کاربر اینگونه به نظر برسد که gensioهای زیرین آن همیشه باز هستند. اگر gensio زیرین قطع شود، این فیلتر تلاش میکند آن را به صورت دورهای دوباره باز کند.
گزینه readbuf در این gensio موجود نیست.
گزینهها (Options)
- retry-time=<gtime>
- بازه زمانی تلاش مجدد را تنظیم میکند. برای جزئیات به بخش gtime مراجعه کنید. در صورت عدم ارائه واحد، پیشفرض میلیثانیه است. پیشفرض ۱ ثانیه است.
- discard-badwrites[=yes|no]
- به طور معمول این gensio هنگامی که gensio پایینی باز نیست، لایه بالایی را کنترل جریان (flow-control) میکند. اگر این گزینه را فعال کنید، در صورتی که gensio پایینی باز نباشد، دادههای نوشتنی را دور میریزد.
script
connecting = script[(options)] accepting = script[(options)]
یک فیلتر gensio که به یک برنامه خارجی اجازه میدهد قبل از گزارش باز بودن، با gensio فرزند تعامل داشته باشد. برنامه خارجی با stdio متصل به فرزند این gensio اجرا میشود، بنابراین نوشتهها از برنامه خارجی در فرزند نوشته میشوند و خواندهها از فرزند در stdin برنامه خارجی نوشته میشوند. اگر برنامه بدون خطا بازگردد، باز شدن برای این gensio موفقیتآمیز است. اگر برنامه خطایی بازگرداند، GE_LOCALCLOSED به عنوان خطای باز شدن گزارش میشود.
گزینه readbuf در این gensio موجود نیست.
گزینهها (Options)
- script=<string>
- برنامه دادهشده در رشته را به عنوان برنامه خارجی اجرا کن. این معادل انجام: gensio=stdio(noredir-stderr),<string> است و صرفاً یک میانبر میباشد.
- gensio=<string>
- به جای اجرای یک برنامه، gensio دادهشده را اجرا کن. هنگامی که gensio بسته شد، یک خطا را مدیریت کن. اگر gensio از دریافت کد خطا پشتیبانی میکرد، آن کار انجام میشود.
sound
connecting = sound[(options)],<device>
ماژول sound gensio امکان دسترسی به دستگاههای صوتی را روی پلتفرم فراهم میکند. این یک gensio غیرمعمول از بسیاری جهات است. برای عملیات جریان عادی چندان کاربردی نیست. با این حال یک عملیات جریانی است، بنابراین همچنان در این ساختار میگنجد. اما برای جلوگیری از کمبود بافر (underrun) و سرریز بافر (overrun)، جریان باید به طور مداوم تغذیه یا مصرف شود.
جریان شامل بایتهایی از دادههای باینری به ترتیب بایت میزبان (host byte order) است. اگر رابط صوتی سطح پایین از ترتیب بایت متفاوتی استفاده کند، در gensio به ترتیب میزبان تبدیل میشود. gensio همچنین میتواند انواع داده را تبدیل کند. اگر فرمت ممیز شناور بخواهید و درایور سطح پایین فقط بتواند اعداد صحیح را انجام دهد، gensio برای شما تبدیل را انجام میدهد. هر آیتم داده (بایت، int16 و غیره) یک نمونه (sample) نامیده میشود. بنابراین درایور دارای فرمت کاربر (آنچه کاربر میبیند) و فرمت PCM (آنچه درایور استفاده میکند) است.
یک جریان دارای تعدادی کانال است، حداقل یک کانال. برای مثال، استریو دارای دو کانال است. یک فریم شامل نمونههایی برای همه کانالها است. فریمها همیشه درهمتنیده (interleaved) هستند؛ کانالهای منفرد به عنوان آیتمهای داده متوالی در جریان ظاهر میشوند. بنابراین در استریو، sample1 کانال ۱ در فریم اول، sample2 کانال ۲ در فریم اول، sample 3 کانال ۱ در فریم دوم و غیره است.
یک بافر مجموعهای از فریمها است. اندازه یک بافر بر حسب فریم مشخص میشود، نه بایت. خواندنها همیشه در قالب تکههایی به اندازه بافر ارائه میشوند. اگر تمام دادههای یک بافر را مصرف نکنید، در خواندن بعدی باقیمانده بافر را به شما میدهد تا بافر مصرف شود. نوشتن را میتوان در هر اندازهای انجام داد، اما عموماً نوشتن تکههایی به اندازه بافر کارآمدتر است.
تعداد بافرها نیز میتواند مشخص شود. شما معمولاً تعداد کافی میخواهید تا دادهها بتوانند بدون تأخیر و روان در دستگاه نوشته شوند اگر برنامه کمی عقب بیفتد، اما تعداد خیلی زیاد باعث ایجاد تأخیر میشود اگر بخواهید دادههای در حال نوشتن را تغییر دهید.
یک sound gensio ممکن است ورودی، خروجی یا هر دو را داشته باشد. شما مشخص میکنید کدام را میخواهید با تنظیم تعداد کانالها روی یک مقدار غیر صفر. بیشتر پارامترها را میتوان با پیشوند "in" یا "out" همراه کرد تا مشخص شود که پارامتر فقط برای دستگاه ورودی و خروجی اعمال میشود. اگر آن پیشوند را نداشته باشید، هم برای ورودی و هم خروجی اعمال خواهد شد. توجه داشته باشید که جریانهای ورودی و خروجی کاملاً مستقل هستند؛ آنها میتوانند نوع، فرمت، نرخ و غیره متفاوتی داشته باشند.
رابطهای صوتی مختلفی روی پلتفرمها در دسترس هستند. برای لینوکس، رابطهای alsa و file در دسترس هستند، و احتمالاً portaudio، بسته به نحوه کامپایل شدن آن. در ویندوز، رابطهای win و file در دسترس هستند و احتمالاً portaudio. در مکاواس portaudio و file در دسترس میباشند.
دستگاه در خط فرمان مشخص میشود. نام دستگاه وابسته به سیستم است. برای alsa، نام باید دقیقاً با اولین خط خروجی فهرست aplay/gsound مطابقت داشته باشد. میتوانید از "aplay -L" یا "arecord -L" برای فهرست کردن دستگاههای ورودی و خروجی در دسترس استفاده کنید. یا میتوانید از برنامه "gsound -L" استفاده نمایید.
برای ویندوز و portaudio، نام فقط باید با بخشی از نام دستگاه مطابقت داشته باشد. نامهای ویندوز همیشه با یک عدد شروع میشوند. بنابراین، برای نمونه، اگر خروجی "gsound -L" روی پلتفرم ویندوز شما به صورت زیر باشد:
-
0:Microphone (Realtek(R) Audio) input,inchans=2
0:Speakers (Realtek(R) Audio) output,outchans=2
اعداد ابتدایی ممکن است تغییر کنند، بنابراین بهتر است از بخشی از نام مانند "Realtek" استفاده کنید که با هر دو ورودی و خروجی مطابقت دارد. این کار یک دستگاه فقط-خروجی را برای ورودی یا دستگاه فقط-ورودی را برای خروجی انتخاب نخواهد کرد.
در MacOS با portaudio ممکن است این را ببینید:
-
0:USB Audio CODEC output,outchans=2
1:USB Audio CODEC input,inchans=2
2:Mac mini Speakers output,outchans=2
که در آن میتوانید از "USB Audio" برای نام استفاده کنید.
برای نوع file، نام دستگاه یک نام فایل است؛ دادهها با فرمت PCM به/از فایل جریان مییابند. اگر نام فایل "-" باشد، به جای باز کردن یک فایل از stdio استفاده میشود.
گزینه readbuf بدیهی است که در این gensio در دسترس نیست.
گزینهها (Options)
- <samplerate>-<channels>-<format>
- برای برنامههای ساده، sound gensio یک فرمت فشرده و ساده را به عنوان گزینه میپذیرد. این مشخصات را برای هر دو کانال ورودی و خروجی تعیین میکند. بنابراین، برای نمونه، "sound(44100-2-float)" دو کانال با نرخ کیفیت CD با استفاده از اعداد ممیز شناور خواهد بود.
- list[=yes|no]
- به جای باز
کردن یک
دستگاه
صوتی، gensio
دادههایی
را در مورد
رابطهای
صوتی مختلف
موجود
ارائه
میدهد. هر
گزینه
دیگری به جز
"type" نادیده
گرفته
میشود. اگر
"type" ارائه
شود،
رابطهای
آن نوع را
فهرست
میکند. اگر
ارائه
نشود،
رابطهای
نوع
پیشفرض را
فهرست
میکند.
دادهها یک رشته خواهند بود که هر رابط با یک خط جدید جدا شده است. یک نام رابط، یک tab، و مشخصات رابط وجود خواهد داشت.
- outdev=<str>
- اگر دستگاه خروجی نام متفاوتی نسبت به دستگاه ورودی دارد، باید جداگانه مشخص شود.
- inbufsize=<n>, outbufsize=<n>, bufsize=<n>
- اندازه بافر را بر حسب نمونهها (samples) مشخص میکند. پیشفرض 1024 است.
- innbufs=<n>, outnbufs=<n>, nbufs=<n>
- تعداد بافرها را برای استفاده مشخص میکند. بسته به نوع رابط ممکن است استفاده شود یا نشود؛ مثلاً برای file نادیده گرفته میشود. پیشفرض 100 است.
- chans=<n>, inchans=<n>, outchans=<n>
- تعداد کانالهای ورودی و خروجی را تنظیم میکند. یکی از اینها باید مشخص شود؛ اگر chans را بگویید، تعداد کانالهای ورودی و خروجی را تنظیم میکند. اگر فقط in یا out را مشخص کنید، دیگری فعال نمیشود.
- inrate=<n>, outrate=<n>, rate=<n>
- نرخ نمونهبرداری، بر حسب نمونه در ثانیه. موارد رایج 44100 (CD) و 48000 (DAT) هستند.
- inhwrateonly=<n>, outhwrateonly=<n>, hwrateonly=<n>
- تنها اجازه استفاده از نرخهای نمونهبرداری پشتیبانیشده توسط سختافزار را بده. فقط توسط ALSA پشتیبانی میشود.
- intype=<n>, outtype=<n>, type=<n>
- نوع رابط را تنظیم میکند. باید "alsa" (فقط لینوکس)، "win" (فقط ویندوز)، "portaudio" (عموماً مکاواس) یا "file" باشد. در صورت عدم تنظیم، به طور پیشفرض روی alsa در لینوکس، win در ویندوز و portaudio در مکاواس قرار میگیرد.
- informat=<n>, outformat=<n>, format=<n>
- نوع داده را برای ارائه به کاربر تنظیم میکند. این یکی از موارد زیر است: float64، float، s32، s16 یا s8. نمونههای کاربر همیشه علامتدار و ممیز شناور یا عدد صحیح هستند. ممیز شناور از -1.0 تا 1.0 نرمالسازی میشود. شما باید این را مشخص کنید.
- inpformat=<n>, outpformat=<n>, pformat=<n>
- فرمت داده در سمت PCM. تمام فرمتهای داده مشخصشده برای format در بالا را دارید. موارد عدد صحیح میتوانند با "u" به جای "s" پیشوند شوند تا بدون علامت شوند (مانند u16)، و همه میتوانند با "le" یا "be" پسوند شوند تا little-endian یا big-endian شوند (مانند float64_le). اگر این را مشخص نکنید، gensio تلاش میکند فرمتی مشابه فرمت کاربر را به کار گیرد. اگر کار نکرد، تلاش میکند بهترین فرمت منطبق را انتخاب کرده و تبدیل کند.
soapy
connecting = soapy[(options)],<device string>
یک gensio که دسترسی به دستگاههای SDR را با کتابخانه SoapySDR فراهم میکند. این یک پوشش نازک (thin wrapper) در اطراف رابط C مربوط به SoapySDR است.
فرمتهای داده همانند sound gensio در بالا هستند، با این تفاوت که نسخههای مختلط (complex) را اضافه میکند. اینها از همان نامهای صوتی استفاده میکنند، اما یک "c" در انتهای نام اضافه مینمایند.
رشته دستگاه در انتهای مشخصات gensio همان چیزی است که به ابزار "SoapySDRUtil" برای شناسایی دستگاهها میدهید. برای جزئیات به آن مراجعه کنید.
مانند sound gensio، بیشتر گزینههای زیر دارای گزینههای "in"، "out" و ساده هستند. آنها کانالهای دریافت، ارسال یا هر دو را تنظیم میکنند.
- inchannel=<n>, outchannel=<n>
- کانال را روی دستگاه SDR مشخص میکند. باید حداقل یکی از اینها را مشخص کنید.
- inbufsize=<n>, outbufsize=<n>, bufsize=<n>
- اندازه بافر را بر حسب نمونهها (نه بایت) مشخص میکند. پیشفرض 1024 است.
- innbufs=<n>, outnbufs=<n>, nbufs=<n>
- تعداد بافرها را برای استفاده مشخص میکند. پیشفرض 100 است.
- inrate=<n>, outrate=<n>, rate=<n>
- نرخ نمونهبرداری، بر حسب نمونه در ثانیه. میتوانید یک "K"، "M" یا "G" در انتهای این برای کیلوهرتز، مگاهرتز و گیگاهرتز قرار دهید. ممکن است توسط سختافزار خاص محدود شود.
- informat=<n>, outformat=<n>, format=<n>
- نوع داده را برای ارائه به کاربر تنظیم میکند. این یکی از موارد: float64، float، s32، s16 یا s8، یا هر یک از آنها با پسوند "c" برای مقادیر مختلط است. نمونههای کاربر همیشه علامتدار و ممیز شناور یا عدد صحیح هستند. ممیز شناور از -1.0 تا 1.0 نرمالسازی میشود. پیشفرض floatc است.
- infreq=<n>, outfreq=<n>, freq=<n>
- فرکانسی را برای تنظیم SDR روی آن مشخص میکند. ممکن است در همه دستگاهها پشتیبانی نشود. میتوانید "K"، "M" یا "G" اضافه کنید. پیشفرض مشخصنشده است.
- inbandwidth=<n>, outbandwidth=<n>, bandwidth=<n>
- پهنای باند را برای کانال مشخص میکند. ممکن است در همه دستگاهها پشتیبانی نشود. میتوانید "K"، "M" یا "G" قرار دهید.
- inagc=<n>, outagc=<n>, agc=<n>
- کنترل خودکار بهره (AGC) را برای کانال مشخص میکند. ممکن است در همه دستگاهها پشتیبانی نشود. پیشفرض off است.
- ingain=<n>, outgain=<n>, gain=<n>
- بهره (gain) را برای کانال مشخص میکند. ممکن است در همه دستگاهها پشتیبانی نشود. پیشفرض مشخصنشده است.
- inantenna=<n>, outantenna=<n>, antenna=<n>
- آنتن مورد استفاده برای کانال را مشخص میکند. ممکن است در همه دستگاهها پشتیبانی نشود.
- in_auto_dc_off[=<true|false>], out_auto_dc_off=..., auto_dc_off=...
- افست DC خودکار را فعال یا غیرفعال میکند. ممکن است در همه دستگاهها پشتیبانی نشود. پیشفرض تنظیمنشده است.
- in_dc_off_i=<n>, out_dc_off_i=..., dc_off_i=..., in_dc_off_q=..., out_dc_off_q=..., dc_off_q=...
- افست DC را برای مؤلفههای I و Q تنظیم میکند. مقداری از ۰ تا ۱ است. ممکن است در همه دستگاهها پشتیبانی نشود.
- in_auto_iq_bal[=<true|false>], out_auto_iq_bal=..., auto_iq_bal=...
- تعادل خودکار IQ را فعال یا غیرفعال میکند. ممکن است در همه دستگاهها پشتیبانی نشود.
- in_iq_bal_i=<n>, out_iq_bal_i=..., iq_bal_i=..., in_iq_bal_q=..., out_iq_bal_q=..., iq_bal_q=...
- تعادل IQ را برای I و Q تنظیم میکند. مقداری از ۰ تا ۱ است. in_freq_corr=<n>, out_freq_corr=..., freq_corr=... تصحیح فرکانس را برای نوسانساز تنظیم میکند. بر حسب بخش در میلیون (PPM) مشخص میشود. پیشفرض تنظیمنشده است.
fsk
connecting = afskmdm[(options)]
connecting = fsk[(options)]
یک فیلتر gensio که روی sound gensio قرار میگیرد و یک مودم کلیدزنی انتقال فرکانس (FSK) را پیادهسازی میکند، مانند آنچه در رادیو آماتوری AX.25 استفاده میشود. این ماژول باید روی یک sound gensio قرار گیرد. یا دقیقتر، یک gensio که کنترلهای GENSIO_CONTROL_IN_BUFSIZE، GENSIO_CONTROL_OUT_BUFSIZE، GENSIO_CONTROL_IN_FORMAT و GENSIO_CONTROL_OUT_FORMAT را پیادهسازی میکند.
در صورت استفاده از afskmdm، برخی پارامترها نسبت به fsk تغییر میکنند تا بهتر با استاندارد 1200 baud AFSK مطابقت داشته باشند.
توجه داشته باشید که sound gensio باید فرمت کاربر ممیز شناور (float) را ارائه دهد.
راهاندازی و کلیدزنی فرستنده (Keying the Transmitter)
به طور پیشفرض، fsk هیچ کار خاصی برای روشن و خاموش کردن فرستنده انجام نمیدهد. در این حالت کلیدزنی باید به صورت VOX باشد، مانند SignaLink.
اگر به روش دیگری برای کلیدزنی فرستنده نیاز دارید، fsk گزینه key را ارائه میدهد. این گزینه یک gensio ایجاد میکند که برای روشن و خاموش کردن فرستنده استفاده میشود. انواع مختلفی از گزینههای کلیدزنی وجود دارد که با keytype مشخص میشوند.
اگر keytype برابر با rw باشد که پیشفرض است، gensio مربوط به کلید را باز کرده و رشته keyon و رشته keyoff را برای این منظور ارسال میکند.
اگر keytype یکی از موارد rts, rtsinv, dtr, dtrinv باشد، gensio کلید را به عنوان یک دستگاه سریال باز کرده و خطوط RTS/DTR را به طور مناسب تنظیم میکند. گزینههای "inv" به این معنی است که تنظیم خط روی "on" فرستنده را خاموش میکند و تنظیم آن روی "off" فرستنده را فعال مینماید.
میتوانید بنویسید:
- keytype=rts,key="serialdev,/dev/serial/by-path/pci-0000:00:14.0-usb-0:4.4.2.4.2:1.0-port0"
تا یک کنترل سریال مبتنی بر RTS را روی یک پورت راهاندازی کنید.
یک کارت صوتی GPIO نوع cm108 به صورت gensio در دسترس است. برای جزئیات به آن gensio مراجعه کنید، اما به طور کلی کاری شبیه به این انجام میدهید:
- keytype=cm108
و این gensio شناسه کارت صدا را از دستگاه صوتی دریافت کرده و از cm108gpio gensio برای کلیدزنی دستگاه استفاده میکند. اگر پیکربندی خاصی دارید که پیشفرض کار نمیکند، میتوانید بنویسید:
- keytype=rw,key="cm108gpio,<dev>"
برای جزئیات به اسناد cm108gpio gensio مراجعه کنید.
اگر به مورد پیچیدهتری نیاز دارید، میتوانید برنامه خود را برای انجام کلیدزنی بسازید و خط زیر را به گزینه fsk خود اضافه کنید:
- key="stdio,mykeyprog --parm1 --parm2",keyon="1",keyoff="0"
و این باعث میشود برنامه mykeyprog در هنگام باز شدن اجرا شود. هنگامی که نیاز به ارسال داشته باشد، یک "1" (بدون خط جدید یا هر چیز دیگری) به stdin برنامه مینویسد. هنگامی که ارسال کامل شد، یک "0" مینویسد. اینها عدد نیستند، نویسههای "0" و "1" هستند.
اگر برنامه شما خروجی به stderr میفرستد، احتمالاً میخواهید stderr-to-stdout را به stdin اضافه کنید تا بافرهای stderr پر نشده و برنامه مسدود نشود. سپس دادههای stderr نادیده گرفته خواهند شد.
میتوانید از rigctld با این استفاده کنید. یک پیکربندی نمونه rigctld:
- rigctld -m 1022 -r /dev/ttyUSB0 -s 4800 -P CM108 -p /dev/hidraw1
و در پیکربندی gensio:
- fsk(key="tcp,localhost,4532",keyon="T 1\n",keyoff="T 0\n")
در اینجا باید مراقب نقلقولها باشید، زیرا مشخصات کلید باید درون گیومه باشد چون حاوی کاما خواهد بود. به استفاده از "\n" در رشتهها برای خط جدید توجه کنید. توالیهای فرار معمولی C مدیریت میشوند. همچنین، از آنجا که مقادیر پیشفرض برای keyon و keyoff همان موارد بالا هستند، نیازی به تعیین آنها در اینجا ندارید.
هر چیزی که از key gensio خوانده شود نادیده گرفته میشود.
گزینهها (Options)
- outgen=<str>
- اجازه میدهد یک پشته gensio خروجی متفاوت برای خروجی مشخص شود. خروجی را در این gensio مینویسد و از فرزند دیگر فقط برای ورودی استفاده میکند.
- rx[=true|false]
- گیرنده را فعال/غیرفعال میکند. پیشفرض true است.
- tx[=true|false]
- فرستنده را فعال/غیرفعال میکند. پیشفرض true است.
- readbuf=<n>
- حداکثر اندازه بستهای را که میتوان خواند تنظیم میکند. پیشفرض 256 است.
- writebuf=<n>
- حداکثر اندازه بستهای را که میتوان نوشت تنظیم میکند. پیشفرض 256 است.
- drain_timeout=<n>
- به بخش مهلت تخلیه (Drain Timeout) مراجعه کنید.
- nchans=<n>, in_nchans=<n>, out_nchans=<n>
- مشخص میکند چند کانال از/به sound gensio میآیند/میروند. sound gensio صدا را برای چندین کانال درهممیتند. به طور پیشفرض این مقدار از sound gensio گرفته میشود.
- bufsize=<n>, in_bufsize=<n>, out_bufsize=<n>
- اندازه بافر ورودی را بر حسب فریم تنظیم میکند.
- chan=<n>, in_chan=<n>, out_chan=<n>
- کدام کانال خاص باید استفاده شود. فقط یک کانال برای صدای ورودی و صدای خروجی استفاده میشود، سایر کانالها نادیده گرفته میشوند یا با صفر پر میشوند. پیشفرض صفر است.
- out_chans=<n>
- یک ماسک بیتی از کانالهایی که باید صدا روی آنها خروجی داده شود تعیین میکند. صدای یکسانی برای تمام کانالهای انتخابشده خروجی داده خواهد شد. بنابراین n=1 فقط روی کانال ۰ خروجی میدهد، n=3 روی کانالهای ۰ و ۱ خروجی میدهد و غیره. پیشفرض فقط کانال ۰ است.
- bps=<n>, in_bps=<n>, out_bps=<n>
- نرخ داده را بر حسب بیت در ثانیه (bps) برای دادهها تنظیم میکند. پیشفرض 2400 برای fsk و 1200 برای afskmdm است.
- samplerate=<n>, in_samplerate=<n>, out_samplerate=<n>
- نرخ نمونهبرداری بر حسب نمونه در ثانیه. پیشفرض از sound gensio گرفته میشود.
- format=none|float|floatc, in_format=..., out_format=...
- فرمت داده ورودی از فرزند را تنظیم میکند. فقط از float (حقیقی) و floatc (مختلط) پشتیبانی میکند.
- checkax25[=true|false]
- بررسی میکند که بسته یک بسته معتبر AX.25 باشد، یعنی طول و آدرس معتبر AX25 داشته باشد. پیشفرض false است. توجه داشته باشید که اگر crc را روی false قرار دهید، این گزینه کار نخواهد کرد.
- crc[=true|false]
- بررسی و ارسال CRCها روی بستهها. پیشفرض false برای fsk و true برای afskmdm است.
- inv[=true|false], in_inv=..., out_inv=...
- دادهها را در ارسال و دریافت معکوس میکند. پیشفرض false برای fsk و true برای afskmdm است.
- diff[=true|false], in_diff=..., out_diff=...
- کدگذاری تفاضلی (differential encoding) انجام میدهد که در آن مقادیر بر اساس تغییرات فرکانس هدایت میشوند نه مقادیر فرکانس. پیشفرض false برای fsk و true برای afskmdm است.
- raw[=true|false]
- به جای انجام پردازش HDLC، فقط بیتهای FSK را به لایه بالاتر منتقل کن و بیتهای FSK جریانی را برای ارسال بپذیر. هیچ پردازش wmsg با این گزینه انجام نمیشود. فرستنده در هر زمان که بیتها در حال ارسال هستند کلیدزنی میشود. این گزینه crc را به false اجبار میکند. پیشفرض true برای fsk و false برای afskmdm است.
- mark=<n>, in_mark=<n>, out_mark=<n>
- فرکانس mark (بالاتر، 1) را برای FSK تنظیم میکند. پیشفرض 1200 برای AFSK است. برای fsk مقدار mark به طور پیشفرض (bps * 4) در صورت تنظیم freqadj، برابر با bps در صورت عدم تنظیم freqadj و فرمت داده float (مقدار حقیقی)، و (bps / 4) در صورت عدم تنظیم freqadj و فرمت داده floatc (مختلط یا I/Q) است.
- space=<n>, in_space=<n>, out_space=<n>
- فرکانس space (پایینتر، 0) را برای FSK تنظیم میکند. پیشفرض 2200 برای afskmdm است. برای fsk پیشفرض (mark - bps / 2) است. این مورد با پیشفرض mark، به MSK پیشفرض میشود.
- in_freqadj[=true|false], out_freqadj=..., freqadj=...
- اگر freqadj تنظیم
نشده باشد،
برای
دادههای
حقیقی (float)
فرکانس به
گونهای
فرض میشود
که
فرکانسهای
mark و space در
آفستهای
مناسب خود
باشند. برای
دادههای
مختلط (I/Q) فرض
میشود
فرکانس
تنظیمشده
در نیمه راه
بین mark و space است.
اگر freqadj تنظیم شود، فرکانس gensio فرزند را به طور خودکار تنظیم میکند تا فرکانسها را از صفر دور نگه دارد و از افستهای DC جلوگیری کند. به فرزند میگوید فرکانس خود و هر فرکانس تنظیمشده بعدی را تنظیم کند تا در صورتی که فرکانس تنظیمشده فرکانس مرکزی باشد، فرکانسهای mark و space در مکان مناسب قرار گیرند.
- uncert[=true|false]
- در حالت raw،
دادههای
عدم قطعیت
(uncertainty) را
درباره هر
بیت
دریافتی در
auxdata ارائه بده.
اگر این
گزینه
تنظیم شود،
auxdata رشتهای
خواهد داشت
که با "uncert="
شروع شده و
به دنبال آن
یک
اشارهگر void
خام قرار
دارد. آن
اشارهگر
آرایهای
از unsigned charها
خواهد بود
که هر کدام
در محدوده
۰-۵۰ هستند
و عدم قطعیت
بیت خاص
مرتبط با آن
را نشان
میدهند.
مقدار ۰
یعنی قطعیت
بالا در
درستی بیت؛
مقدار ۵۰
یعنی فقط
۵۰٪ شانس
درستی بیت
وجود دارد.
برای دریافت آرایه، کدی مانند این اجرا کنید:
unsigned char *uncertarray = NULL; for (i = 0; auxdata && auxdata[i]; i++) {
if (strncmp(auxdata[i], "uncert=") == 0) {
memcpy(&uncertarray, auxdata[i] + 7, sizeof(uncertarray));
break;
}
}این آرایه برای هر بیت در دادههای ورودی است و ابتدا با LSB ایندکس میشود. بنابراین ۸ برابر اندازه دادههای ورودی خواهد بود. در صورت غیرخام بودن نادیده گرفته میشود. پیشفرض false است.
- certmult=<n>
- هنگام محاسبه قطعیت، آن را در مقدار ممیز شناور دادهشده ضرب کن. پیشفرض 1.0 برای afskmdm و 100 برای fsk است.
- wmsgs=<n>
- تعداد پیامهای دریافتی کاری همزمان. اگر بیتی در آزمون قطعیت مردود شود، برای هر پیام کاری فعلی، دو پیام ایجاد میشود؛ یکی با هر احتمال بیتی، تا سقف تعداد مشخصشده در این گزینه. اینها تا زمانی که پیامی به درستی دریافت شود (با CRC) یا سری بیتها نامعتبر شوند نگهداری میشوند. به این ترتیب، اگر wmsg برابر با 2^n باشد، یک پیام میتواند در صورت اشتباه بودن حداکثر n بیت به درستی رمزگشایی شود. پیشفرض ۱ برای fsk و ۳۲ برای afskmdm است.
- wmsg-extra=<n>
- تعداد سطوح تقویت اضافی را برای امتحان فرکانسهای mark و space تنظیم میکند. پیشفرض ۰ برای fsk و ۱ برای afskmdm است.
- min-certainty=<float>
- عدد ممیز شناوری که حداقل قطعیت را مشخص میکند که بالاتر از آن بیت خوب در نظر گرفته میشود. پیشفرض 2.0 است.
- filttype=[fir|iir|none]
- یک فیلتر پایینگذر مرتبه دوم Butterworth IIR یا یک فیلتر پایینگذر FIR روی ورودی پیادهسازی میشود. این گزینه نوع فیلتر یا بدون فیلتر را انتخاب میکند. پیشفرض IIR برای نرخهای نمونهبرداری بالای 30000Hz و FIR برای نرخهای نمونهبرداری پایینتر است.
- lpcutoff=<n>
- فرکانس قطع را برای فیلتر پایینگذر ورودی تنظیم میکند. تنظیم روی صفر آن را غیرفعال میکند. پیشفرض 2300 برای afskmdm و صفر برای fsk است.
- lpgain=<n>
- بهره را برای فیلتر پایینگذر تنظیم میکند. پیشفرض 0.9 است.
- hpcutoff=<n>
- فرکانس قطع را برای فیلتر بالاگذر ورودی تنظیم میکند. تنظیم روی صفر آن را غیرفعال میکند. پیشفرض ۰ است.
- maxadj=<n>
- پردازش ورودی موقعیت فریم را تنظیم میکند تا آن را با دادههای ورودی تراز نگه دارد. این حداکثر مقداری را که میتواند موقعیت فریم را (بر حسب فریم) در هر تنظیم حرکت دهد تعیین میکند. اگر ۰ باشد (پیشفرض) به طور خودکار محاسبه میشود.
- trfreq=<n>
- عرض فرکانس گذار را برای فیلتر FIR تنظیم میکند. برای فیلتر IIR نادیده گرفته میشود. پیشفرض 500Hz است.
- tx-preamble=<n>
- مدت زمان به میلیثانیه در ابتدای پیام که فقط پرچمها هستند. پیشفرض 300 است.
- tx-tail=<n>
- مدت زمان به میلیثانیه در انتهای پیام که فقط پرچمها هستند. پیشفرض 100 است.
- tx-predelay=<n>
- میزان زمان انتظار پس از اتمام ارسال پیام توسط فرستنده دیگر قبل از شروع ارسال. پیشفرض 500ms است.
- volume=<float>
- میزان صدای ارسال را از 0.0 تا 1.0 تنظیم میکند. مقادیر بالای 1.0 دچار برش (clip) خواهند شد. پیشفرض 0.75 است.
- key=<gensio string>
- یک gensio ایجاد میکند که برای کلیدزنی فرستنده روی حالت روشن و خاموش استفاده خواهد شد.
- keytype=rw|rts|rtsinv|dtr|dtrinv|cm108
- نوع کلیدزنی انجامشده را تعیین میکند. پیشفرض rw است.
- keyon=<string>, keyoff=<string>
- رشتههایی برای ارسال به key gensio جهت روشن و خاموش کردن فرستنده. فقط برای keytype=rw است. پیشفرض به ترتیب "T 1\n" و "T 0\n" است که مورد پذیرش rigctld میباشد.
- keybit=<n>
- شماره بیت مورد استفاده را در keytype نوع cm108 تنظیم میکند. پیشفرض ۳ است.
- full-duplex[=yes|no]
- با جریانهای خواندن و نوشتن به عنوان جریانهای کاملاً مستقل رفتار کن. ارسال بررسی نمیکند که آیا چیزی قبل از ارسال در حال دریافت است یا خیر، تمام ارسالها فوراً شروع میشوند.
hdlc
connecting = hdlc[(options)]
این یک کدگذار/کدگشای HDLC است. طراحی شده تا روی یک مودم مانند fsk در حالت خام قرار گیرد و عملیات HDLC را انجام دهد. توجه داشته باشید که دادههای خروجی از پایین این ماژول بزرگتر از دادههای ورودی به بالای آن خواهند بود زیرا مقدمه (preamble)، مؤخره (postamble) و درج بیت (bit stuffing) انجام میشود. معادله محاسبه اندازه به شرح زیر است:
size = (<max_size> + 2) + (((<max_size> + 2) * 8) / 5 + 7) /
8
مقدار "+ 2" برای CRC است، سپس به بیت تبدیل شده و بر ۵ تقسیم میشود تا حداکثر تعداد کل بیتهای صفر درجشده به دست آید، سپس برای گرد کردن مناسب هنگام تبدیل مجدد به بایت عدد ۷ اضافه شده و به بایت تبدیل میشود. این برای هر دو خواندن و نوشتن است.
این gensio از nbits فقط در رابط پایینتر پشتیبانی میکند. برای جزئیات به بخش "پارامتر nbits در auxdata" در این سند مراجعه کنید.
گزینهها (Options)
- readbuf=<n>
- حداکثر اندازه بستهای را که میتوان خواند تنظیم میکند. پیشفرض 256 است.
- writebuf=<n>
- حداکثر اندازه بستهای را که میتوان نوشت تنظیم میکند. پیشفرض 256 است.
- checkax25[=true|false]
- بررسی میکند که بسته یک بسته معتبر AX.25 باشد. پیشفرض false است. در صورت تنظیم crc روی false، این گزینه کار نخواهد کرد.
- crc[=true|false]
- بررسی و ارسال CRCها روی بستهها. پیشفرض true است.
- wmsgs=<n>
- تعداد پیامهای کاری همزمان دریافتی. پیشفرض 32 است.
- max-uncertainty
- حداکثر عدم قطعیت از مودم که بیت را مشکوک کرده و پردازش wmsg را فراخوانی میکند. هر مقداری زیر این مقدار خوب در نظر گرفته میشود. پیشفرض 25 است.
- tx-preamble
- تعداد نویسههای همگامسازی (0x7e) برای ارسال در ابتدای بسته تا به گیرنده اجازه دهد بسته را تشخیص داده و خود را تراز کند. پیشفرض 25 است.
- tx-postamble
- تعداد نویسههای همگامسازی برای ارسال در انتهای یک بسته جهت مشخص کردن پایان. پیشفرض ۲ است.
convcode
connecting = convcode(options)
این یک کدگذار/کدگشای کانولوشنال (convolutional coder/decoder) است. طراحی شده تا روی یک فرستنده/گیرنده بستهای قرار گیرد. با بستهها سر و کار دارد نه با دادههای جریانی.
شما باید "k" و چندجملهایها را با "p" تنظیم کنید.
دادههای ورودی/خروجی از پایین کدگذار بیش از دو برابر اندازه دادههای بالا خواهند بود. معادله به صورت زیر است:
<size in bits> = (<top size in bytes> + (k - 1)) * 8 * 2
این gensio از nbits در رابط بالا و پایین پشتیبانی میکند. به بخش "پارامتر nbits در auxdata" در این سند مراجعه کنید.
گزینهها (Options)
- readbuf=<n>
- حداکثر اندازه بستهای را که میتوان خواند تنظیم میکند. پیشفرض 256 است.
- writebuf=<n>
- حداکثر اندازه بستهای را که میتوان نوشت تنظیم میکند. پیشفرض 256 است.
- k=<n>
- طول چندجملهای را برای کدگذاری تنظیم میکند. p=<n> یک چندجملهای به مجموعه چندجملهایها اضافه میکند. میتوانید کدگذاری با حداکثر ۸ چندجملهای داشته باشید.
axfec
connecting = axfec(options)
این یک درهمباف (interleaver)، کدگذار کانولوشنال و پردازنده HDLC است که برای کار با رادیوی AX5043 شرکت Onsemi در حالت FEC طراحی شده است. بسیار تخصصی است و نکات و هشدارهای زیادی برای عملکرد صحیح آن در اینجا و روی AX5043 وجود دارد. این بخشها را نمیتوان به راحتی از هم جدا کرد.
این ماژول اساساً برای ماهوارههای PacSat مربوط به AMSAT که از AX5043 با FEC استفاده میکنند در اینجا قرار دارد. همچنین یک لایه عمومی برای انجام FEC روی پیوند داده است و برای آن به خوبی کار میکند.
گزینهها (Options)
- readbuf=<n>
- حداکثر اندازه بستهای را که میتوان خواند تنظیم میکند. پیشفرض 256 است.
- writebuf=<n>
- حداکثر اندازه بستهای را که میتوان نوشت تنظیم میکند. پیشفرض 256 است.
- tx-preamble
- تعداد نویسههای همگامسازی (0x7e) برای ارسال در ابتدای بسته جهت تشخیص بسته و تراز گیرنده. پیشفرض 15 است.
cm108gpio
connecting = cm108gpio[(options)],<soundcard>
این ماژول اجازه میدهد یک GPIO روی کارت صدای cm108 کنترل شود. برخی دستگاههای کارت صدای رادیویی از یکی از این بیتها برای کلیدزنی فرستنده استفاده میکنند. هر نوشتنی با مقدار '1' در آن GPIO را فعال کرده و هر نوشتنی با '0' آن را غیرفعال میکند. ۸ پین GPIO در دسترس است (۱ تا ۸)؛ اکثر دستگاهها از ۳ استفاده میکنند.
برای لینوکس، <soundcard> شماره کارت صدا یا نام دستگاه دادهشده برای باز کردن دستگاه صدا است، عموماً آنچه درست بعد از ":" میآید، مثلاً "plughw,1,0" برابر با "1" خواهد بود. اگر "plughw,Device,0" باشد، برابر با "Device" خواهد بود.
برای ویندوز، <soundcard> همان چیزی است که برای کارت صدا قرار میدهید، مانند "USB PnP Sound" یا هر آنچه "gsound -L" برای دستگاه شما برمیگرداند.
گزینه readbuf در این gensio موجود نیست.
گزینهها (Options)
- bit=1-8
- شماره بیت برای کنترل. پیشفرض ۳ است.
انشعاب فرآیند و gensioها (FORKING AND GENSIOS)
برخلاف توصیفگرهای فایل معمولی، هنگامی که با یک gensio عملیات fork را انجام میدهید، اکنون دو نسخه نامرتبط از gensioها دارید. بنابراین اگر عملیاتی را روی یکی انجام دهید، ممکن است دیگری را به هم بریزد. حتی یک close ممکن است مشکلاتی ایجاد کند؛ اگر یک اتصال SSL را ببندید، دادههایی را به طرف دیگر برای بستن اتصال ارسال میکند، حتی اگر انشعاب (fork) دیگر آن را نخواهد.
برای جلوگیری از مشکلات در این زمینه، به طور کلی باید ابتدا مطمئن شوید که هیچ رزوهای (thread) در حالت انتظار (wait)، فراخوانی سرویس یا هر نوع چیزی که توصیفگرهای فایل یا تایمرها را بررسی کرده و روی آنها اقدام میکند نباشد. این بسیار مهم است و باید آن را قبل از fork انجام دهید.
سپس پس از fork، باید دستور زیر را فراخوانی کنید:
- gensio_disable(io)
روی تمام gensioهایی که آن fork استفاده نمیکند، و سپس gensioها را آزاد (free) کنید. از close استفاده نکنید، از free استفاده کنید. سپس باید دستور زیر را فراخوانی کنید:
- gensio_acc_disable(acc)
روی هر gensio accepter که آن fork استفاده نمیکند، و سپس آنها را آزاد کنید. اگر اتصالی در حال انجام باشد و به کاربر گزارش نشده باشد، غیرفعال شده و سپس بسته خواهد شد.
نمیتوانید یک gensio را بین دو فرآیند مختلف به اشتراک بگذارید. اگر یک gensio در یک fork استفاده میشود، باید در fork دیگر غیرفعال و بسته شود.
مشکل دیگر در انشعاب فرآیند در لینوکس، epoll است. یک توصیفگر فایل epoll در هنگام fork تکثیر نمیشود؛ هر دو fork همان توصیفگر epoll یکسان را دریافت میکنند. اگر epoll fd را در یک fork ببندید، آن را برای دیگری نیز میبندد. برای جلوگیری از این مشکل، گرداننده سیستمعامل دارای تابع handle_fork() است که باید پس از fork در fork جدید (نه قبلی) فراخوانی کنید. این تابع هرگونه پاکسازی مورد نیاز پس از fork را مدیریت خواهد کرد. سیستمهای دیگر ممکن است نیازمند پاکسازیهای دیگری پس از fork باشند، بنابراین همیشه باید این تابع را پس از fork فراخوانی کنید.
همچنین ببینید (SEE ALSO)
gensiot(1), sctp(7), udp(7), tcp(7), unix(7), gensio_open(3), gensio_close(3), gensio_control(3), gensio_set_sync(3), gensio_write(3), gensio_acc_set_sync(3), gensio_acc_control(3), gensio_os_funcs(3), str_to_gensio(3), str_to_gensio_accepter(3), gensio_set_read_callback_enable(3), gensio_err(3), gensio_mdns(3), gensio_get_type(3), gensio_acc_get_type(3), gensio_acc_set_accept_callback_enable(3), gensio_event(3), gensio_accepter_event(3), gensio_acc_shutdown(3), gensio_set_callback(3) gensio_acc_set_callback(3), gensio_add_default(3), gensio_alloc_channel(3), gensio_set_log_mask(3), gensio_acc_startup(3), gensio_acc_shutdown(3), gensio_bswap(3), gensio_atomics(3), gensio_refcount(3)
مشکلات شناختهشده (KNOWN PROBLEMS)
هیچ موردی گزارش نشده است.
نویسندگان (AUTHORS)
Corey Minyard <minyard@acm.org>
| 01/02/19 | تعیین و مشخص کردن یک gensio |