کتابخانه‌ی استاندارد · شبکه

ساکس net.socks

SOCKS4، SOCKS4a و SOCKS5: کارخواه با ورود، BIND و UDP ASSOCIATE، کارساز با کاربر، قاعده‌های دسترسی و راه جایگزین‌پذیر رسیدن به مقصد، و یک اتصال‌دهنده برای زنجیره‌ی پراکسی.

واردسازی شبکه.ساکس

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

SOCKS پروتکل پراکسی ساده و بسیار پشتیبانی‌شده است: برنامه از پراکسی می‌خواهد از طرف او به جایی وصل شود و سپس از راه آن اتصال مثل اتصال مستقیم حرف می‌زند. این بسته هر دو سمت را دارد. اتصال کارخواه است؛ شروع یک کارساز راه می‌اندازد. به تونل هم وصل می‌شود: به شکل ورودی ساکس۵ یا ورودی ساکس۴ که می‌تواند یک درگاه را با پراکسی HTTP شریک شود، و به شکل رابط ساکس که یک گام از زنجیره‌ی پراکسی است. برای دیدن اینکه تکه‌ها در یک برنامه چگونه کنار هم می‌نشینند، ساختن برنامه‌ای به سبک v2ray یا VPN را بخوانید.

ایده‌های اصلی:

  • کارخواه یک مقدار است: کلاینت جدید یا کلاینت جدید با احراز هویت یک کلاینت پر می‌کند و اتصال یک نتیجه اتصال با یک جریان برمی‌گرداند. شکست هم مقدار است: موفق نادرست است و کد و خطا دلیل را می‌گویند.
  • پیش‌فرض SOCKS5 است. برای کارسازهای قدیمی‌تر نسخه را ساکس۴ یا ساکس۴ای بگذارید. SOCKS4 نشانی IPv4 می‌فرستد؛ SOCKS4a می‌گذارد کارساز نام را حل کند.
  • نامی که به پراکسی SOCKS5 یا SOCKS4a فرستاده شود را پراکسی حل می‌کند، پس جستجو روی دستگاه شما انجام نمی‌شود.
  • کارساز یک پیکربندی سرور است که به شروع داده می‌شود. شیوه‌ی رسیدنش به مقصدها یک تابع بازخوان (تعیین اتصال به مقصد) یا یک تونل.شماره‌گیر (تعیین شماره‌گیر) است، و همین‌طور به قاعده‌های مسیریابی و زنجیره‌ی پراکسی وصل می‌شود.
  • ایجاد نشست یو دی پی یک رله‌ی UDP باز می‌کند و پیوند درخواست منتظر یک اتصال ورودی می‌ماند. هر دو ویژگی SOCKS5 هستند که کارساز می‌تواند خاموششان کند.

چیزهایی که آدم را گیر می‌اندازد:

  • کارساز روی bind_host گوش می‌دهد که پیش‌فرضش 127.0.0.1 است. 0.0.0.0 (یا یک نشانی) را فقط عمداً بدهید. کارساز SOCKS بدون ورود که از بیرون در دسترس باشد یک پراکسی باز است و هر کسی می‌تواند از آن سوءاستفاده کند. کاربر الزامی کنید (افزودن کاربر)، با دیوار آتش محدودش کنید یا پشت تونل بگذارید.
  • ورود رمزشده نیست. نام کاربری و گذرواژه‌ی SOCKS5 به شکل متن ساده می‌رود. آن را روی درگاه محلی یا از راه تونل رمزشده به کار ببرید، یا وقتی پراکسی روی TLS در دسترس است امن را بگذارید. سمت کارساز این بسته فقط TCP ساده حرف می‌زند.
  • SOCKS4 گذرواژه ندارد. کارسازی که ورود بخواهد کارخواه‌های SOCKS4 را رد می‌کند و اجازه ساکس۴ می‌تواند SOCKS4 را خاموش کند.
  • اجازه پیوند به‌طور پیش‌فرض خاموش است چون BIND پراکسی را وادار می‌کند برای کارخواه درگاهی باز کند و رله‌ی UDP هم همین را با یک درگاه UDP می‌کند. این سوکت‌ها هم به bind_host بسته می‌شوند و همان نشانی به کارخواه گزارش می‌شود.
  • UDP قطعه ندارد. فقط قطعه‌ی ۰ پشتیبانی می‌شود و UDP روی SOCKS4 وجود ندارد.
  • IPv6 سرتاسر کار می‌کند. CONNECT و BIND در TCP و رله‌ی UDP هدف‌های IPv6 (نوع نشانی ۴) را می‌برند و سرور می‌تواند روی ::1 یا روی :: برای هر دو خانواده گوش دهد. رله‌ی UDP بسته به نشانی IPv4 هم با یک سوکت خروجی دوم به هدف‌های IPv6 می‌رسد. SOCKS4 همچنان IPv4 است.
  • جریان‌ها را ببندید. جریان یک اتصال باز است. پایان کار ببندیدش.

استفاده از پراکسی SOCKS در برنامه

برای پراکسی یک کارخواه بسازید، به یک مقصد وصل شوید و از جریان استفاده کنید. پراکسی اینجا یک کارساز محلی است تا نمونه هرجا اجرا شود؛ در کار واقعی نشانی پراکسی‌ای است که به آن اعتماد دارید.

net-socks-guide-client.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی

تابع echo_conn(arg: صحیح۶۴):
    c := تی سی پی.اتصال از توصیف‌گر(arg)
    تا درست:
        data := تی سی پی.خواندن(c، 4096)
        اگر data.طول() برابر 0:
            بشکن
        پایان
        تی سی پی.نوشتن(c، data)
    پایان
    تی سی پی.بستن(c)
پایان

تابع echo_accept(arg: صحیح۶۴):
    srv := تی سی پی.سرور { توصیفگر = arg }
    تا درست:
        c := تی سی پی.پذیرش(srv)
        اگر وارونه تی سی پی.اتصال معتبر(c):
            بشکن
        پایان
        ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
    پایان
پایان

تابع start_echo(): صحیح:
    listener := تی سی پی.پیوند(0)
    ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
    برگشت تی سی پی.درگاه(listener)
پایان

تابع ریشه:
    target := start_echo()
    ناپایا proxy_cfg := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(proxy_cfg، درست)
    proxy := ساکس.شروع(proxy_cfg)

    client := ساکس.کلاینت جدید("127.0.0.1"، proxy.درگاه)
    result := ساکس.اتصال(client، "127.0.0.1"، target)
    اگر وارونه result.موفق:
        سرچاپ "پراکسی نپذیرفت:"، result.کد، result.خطا
        برگشت
    پایان
    result.جریان.نوشتن("hello from behind the proxy")
    سرچاپ result.جریان.خواندن(100)
    result.جریان.بستن()
    ساکس.توقف(proxy)
پایان
خروجیhello from behind the proxy

شماره‌گیری اتصال همین کار را می‌کند ولی یک اتصال TCP ساده برمی‌گرداند، برای کدی که از پیش از net.tcp استفاده می‌کند. برای پراکسی‌ای که ورود می‌خواهد کلاینت جدید با احراز هویت را به کار ببرید. برای عبور از دو پراکسی پشت هم تونل.زنجیره و نمونه‌ی زنجیره‌ی پایین را ببینید.

راه انداختن کارساز SOCKS

پیکربندی سرور جدید پیکربندی یک درگاه را می‌دهد؛ افزودن کاربر ورود را روشن می‌کند؛ شروع درگاه را می‌بندد و بی‌درنگ برمی‌گردد و توقف پایانش می‌دهد. شیوه‌ی رسیدن کارساز به مقصد بخشی است که معمولا تغییرش می‌دهید: اتصال مستقیم را برای پراکسی ساده بگذارید، با تعیین اتصال به مقصد یک تابع بازخوان برای مسیریابی با نام بگذارید، یا با تعیین شماره‌گیر یک تونل.شماره‌گیر بدهید تا از قاعده‌ها، زنجیره‌ها و فهرست‌های مسدود تونل استفاده کند. اجازه می‌تواند پیش از هر اتصال، فرمان، میزبان یا درگاه را رد کند.

برای گذاشتن SOCKS روی همان درگاه پراکسی HTTP، به جای صدا زدن شروع یک ورودی ساکس۵ را به یک تونل.پروتکل ترکیبی بدهید. رسیدگی یک جریان تکی را که خودتان پذیرفته‌اید سرویس می‌دهد.

ناپایا config := ساکس.پیکربندی سرور جدید(1080)
ساکس.افزودن کاربر(config، "alice"، "یک گذرواژه‌ی بلند و تصادفی")
server := ساکس.شروع(config)
اگر وارونه server.موفق:
    سرچاپ "درگاه ۱۰۸۰ مشغول است"
پایان

چه باید دانست

  • کارساز روی bind_host (به‌طور پیش‌فرض loopback) گوش می‌دهد. ورود یا دیوار آتش به کار ببرید، هرگز پراکسی باز نگذارید.
  • ورود متن ساده است. SOCKS4 اصلا ورود ندارد.
  • در SOCKS5 و SOCKS4a نام را پراکسی حل می‌کند و در SOCKS4 کارخواه.
  • شروع حلقه‌ی پذیرش را روی نخ خودش اجرا می‌کند؛ اتصال‌ها روی نخ‌های دیگر. توقف فقط کارخواه‌های تازه را می‌ایستاند.
  • رمزگشاها (رمزگشایی درخواست، رمزگشایی پاسخ، رمزگشایی درخواست ساکس۴، رمزگشایی نشانی) بایت‌های مصرف‌شده، ۰ برای «داده‌ی بیشتر لازم است» و ۱- برای نامعتبر را برمی‌گردانند، پس روی بافر در حال رشد کار می‌کنند.
  • هیچ گزارشی خودکار نوشته نمی‌شود.

گونه‌ها

کلاینت Client

ساختار کلاینت
یک کارخواه SOCKS: از کدام پراکسی استفاده شود، کدام نسخه و اعتبارنامه. با کلاینت جدید یا کلاینت جدید با احراز هویت ساخته می‌شود.
نامانگلیسیگونهتوضیح
نسخهversionصحیح = 5ساکس۵، ساکس۴ یا ساکس۴ای. پیش‌فرض SOCKS5 است.
میزبانhostرشته = ""نام میزبان یا IP کارساز پراکسی.
درگاهportصحیح = 0درگاه کارساز پراکسی.
نام کاربریusernameرشته = ""نام کاربری برای SOCKS5 (یا فیلد شناسه‌ی کاربر در SOCKS4).
گذرواژهpasswordرشته = ""گذرواژه برای SOCKS5. فقط وقتی نام کاربری هست فرستاده می‌شود.
مهلت میلی‌ثانیهtimeout_msصحیح = 10000اتصال و دست‌دهی چند میلی‌ثانیه می‌تواند طول بکشد. پیش‌فرض ۱۰۰۰۰.
امنtlsمنطقی = نادرستدرست یعنی نخست اتصال به پراکسی در TLS پیچیده شود (SOCKS روی TLS). پیش‌فرض نادرست.
نام سرورserver_nameرشته = ""نامی که وقتی امن روشن است در گواهی پراکسی فرستاده و بررسی می‌شود. خالی یعنی همان میزبان.
بدون اعتبارسنجیinsecureمنطقی = نادرستدرست یعنی بررسی گواهی نادیده گرفته شود. فقط برای آزمون.
net-socks-Connect.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی

تابع echo_conn(arg: صحیح۶۴):
    c := تی سی پی.اتصال از توصیف‌گر(arg)
    تا درست:
        data := تی سی پی.خواندن(c، 4096)
        اگر data.طول() برابر 0:
            بشکن
        پایان
        تی سی پی.نوشتن(c، data)
    پایان
    تی سی پی.بستن(c)
پایان

تابع echo_accept(arg: صحیح۶۴):
    srv := تی سی پی.سرور { توصیفگر = arg }
    تا درست:
        c := تی سی پی.پذیرش(srv)
        اگر وارونه تی سی پی.اتصال معتبر(c):
            بشکن
        پایان
        ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
    پایان
پایان

تابع start_echo(): صحیح:
    listener := تی سی پی.پیوند(0)
    ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
    برگشت تی سی پی.درگاه(listener)
پایان

تابع say(label: رشته، r: ساکس.نتیجه اتصال):
    سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان

تابع ریشه:
    echo := start_echo()
    ناپایا server_cfg := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(server_cfg، درست)
    server := ساکس.شروع(server_cfg)
    سرچاپ "server up:"، server.موفق

    client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
    سرچاپ client.نسخه برابر ساکس.ساکس۵، client.مهلت میلی‌ثانیه، client.امن
    r := ساکس.اتصال(client، "127.0.0.1"، echo)
    say("connect"، r)
    r.جریان.نوشتن("hello through socks5")
    سرچاپ r.جریان.خواندن(100)
    r.جریان.بستن()

    by_name := ساکس.اتصال(client، "localhost"، echo)
    by_name.جریان.نوشتن("by name")
    سرچاپ by_name.جریان.خواندن(100)
    by_name.جریان.بستن()

    conn := ساکس.شماره‌گیری اتصال(client، "127.0.0.1"، echo)
    تی سی پی.نوشتن(conn، "plain tcp conn")
    سرچاپ تی سی پی.خواندن(conn، 100)
    تی سی پی.بستن(conn)

    say("refused"، ساکس.اتصال(client، "127.0.0.1"، تی سی پی.درگاه آزاد()))
    say("no such host"، ساکس.اتصال(client، "no-such-host.invalid"، 80))
    ساکس.توقف(server)
پایان
خروجیserver up: true true 10000 false connect: ok=true code=0 hello through socks5 by name plain tcp conn refused: ok=false code=5 connection refused no such host: ok=false code=4 host unreachable

نتیجه دست‌دهی HandshakeResult

ساختار نتیجه دست‌دهی
نتیجه‌ی یک فرمان SOCKS روی یک جریان باز.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی کارساز درخواست را پذیرفت.
کدcodeصحیح = 0کد پاسخ، کد موفق و خانواده‌ی کد ساکس۴ پذیرفته را ببینید.
خطاerrرشته = ""دلیل خوانا در صورت شکست.
نشانی محلیboundنشانینشانی‌ای که کارساز گزارش می‌دهد: آنچه بسته (برای BIND) یا آنچه از آن وصل شده.
net-socks-Chain.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل

تابع echo_conn(arg: صحیح۶۴):
    c := تی سی پی.اتصال از توصیف‌گر(arg)
    تا درست:
        data := تی سی پی.خواندن(c، 4096)
        اگر data.طول() برابر 0:
            بشکن
        پایان
        تی سی پی.نوشتن(c، data)
    پایان
    تی سی پی.بستن(c)
پایان

تابع echo_accept(arg: صحیح۶۴):
    srv := تی سی پی.سرور { توصیفگر = arg }
    تا درست:
        c := تی سی پی.پذیرش(srv)
        اگر وارونه تی سی پی.اتصال معتبر(c):
            بشکن
        پایان
        ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
    پایان
پایان

تابع start_echo(): صحیح:
    listener := تی سی پی.پیوند(0)
    ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
    برگشت تی سی پی.درگاه(listener)
پایان

تابع ریشه:
    echo := start_echo()
    ناپایا first_cfg := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(first_cfg، درست)
    first := ساکس.شروع(first_cfg)
    ناپایا second_cfg := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(second_cfg، درست)
    second := ساکس.شروع(second_cfg)

    hop := ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، first.درگاه)، "127.0.0.1"، second.درگاه)
    سرچاپ "first hop:"، hop.موفق
    onward := ساکس.دست‌دهی کلاینت(hop.جریان، ساکس.کلاینت جدید(""، 0)، ساکس.فرمان اتصال، "127.0.0.1"، echo)
    سرچاپ "second hop:"، onward.موفق
    hop.جریان.نوشتن("through two proxies")
    سرچاپ hop.جریان.خواندن(100)
    hop.جریان.بستن()

    ناپایا chain := تونل.زنجیره جدید(تونل.مستقیم())
    تونل.افزودن گام(chain، ساکس.رابط جدید(ساکس.کلاینت جدید("127.0.0.1"، first.درگاه)))
    تونل.افزودن گام(chain، ساکس.رابط جدید(ساکس.کلاینت جدید("127.0.0.1"، second.درگاه)))
    سرچاپ chain.نام()
    s := chain.اتصال(تونل.نشانی جدید("127.0.0.1"، echo))
    s.نوشتن("same thing with a chain")
    سرچاپ s.خواندن(100)
    s.بستن()

    connector := ساکس.رابط جدید(ساکس.کلاینت جدید("127.0.0.1"، first.درگاه))
    سرچاپ connector.نام()، connector.کارساز().متن() برابر "127.0.0.1:" + first.درگاه
    ساکس.توقف(first)
    ساکس.توقف(second)
پایان
خروجیfirst hop: true second hop: true through two proxies chain>socks5>socks5 same thing with a chain socks5 true

نتیجه اتصال ConnectResult

ساختار نتیجه اتصال
نتیجه‌ی اتصال یا پیوند درخواست: جریان در صورت موفقیت و دلیل در غیر این صورت.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی پراکسی شما را به مقصد وصل کرد.
کدcodeصحیح = 0کد پاسخ.
خطاerrرشته = ""دلیل خوانا در صورت شکست.
جریانstreamdyn تونل.جریانجریان باز به مقصد (از راه پراکسی). وقتی موفق درست است معتبر است.
نشانی محلیboundنشانینشانی‌ای که پراکسی گزارش می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

نشست یو دی پی UDPSession

ساختار نشست یو دی پی
یک نشست UDP ASSOCIATE در SOCKS5: یک اتصال کنترل TCP به‌علاوه‌ی یک سوکت UDP که به رله‌ی پراکسی اشاره می‌کند. با ایجاد نشست یو دی پی ساخته می‌شود.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی نشست ساخته شد.
خطاerrرشته = ""دلیل خوانا اگر ساخته نشد.
کنترلcontroldyn تونل.جریاناتصال TCP که نشست را زنده نگه می‌دارد. بستنش نشست را پایان می‌دهد.
سوکتsockیو دی پی.سوکت یو دی پیسوکت UDP که برای فرستادن و گرفتن دیتاگرام به کار می‌رود.
میزبان رلهrelay_hostرشته = ""نشانی رله‌ای که پراکسی داد.
درگاه رلهrelay_portصحیح = 0درگاه رله‌ای که پراکسی داد.
net-socks-Udp.salam
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.ساکس
واردسازی شبکه.یو دی پی
واردسازی رشته

تابع udp_echo(arg: صحیح۶۴):
    s := یو دی پی.سوکت یو دی پی { توصیفگر = arg }
    buf := حافظه.تخصیص(2048 برگردان طبیعی۶۴)
    تا درست:
        ناپایا host := ""
        ناپایا port := 0
        n := یو دی پی.دریافت بایت(s، buf، 2048، host، port)
        اگر n کوچکتر 0:
            بشکن
        پایان
        یو دی پی.ارسال بایت(s، host، port، buf، n)
    پایان
پایان

تابع ریشه:
    echo := یو دی پی.پیوند(0)
    echo_port := یو دی پی.درگاه(echo)
    ساکس.برو(udp_echo، echo.توصیفگر برگردان تهی*)

    ناپایا server_cfg := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(server_cfg، درست)
    server := ساکس.شروع(server_cfg)
    client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
    session := ساکس.ایجاد نشست یو دی پی(client)
    سرچاپ "associated:"، session.موفق، session.میزبان رله
    ساکس.تنظیم مهلت یو دی پی(session، 2000)
    سرچاپ "sent:"، ساکس.ارسال یو دی پی(session، "127.0.0.1"، echo_port، "datagram one")

    buf := حافظه.تخصیص(1024 برگردان طبیعی۶۴)
    ناپایا from := ساکس.نشانی {}
    n := ساکس.دریافت بایت یو دی پی(session، buf، 1024، from)
    سرچاپ "received:"، n، "from"، from.میزبان، from.درگاه برابر echo_port
    (buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
    سرچاپ رشته.رونوشت(buf برگردان رشته)
    سرچاپ "bytes sent:"، ساکس.ارسال بایت یو دی پی(session، "127.0.0.1"، echo_port، "raw" برگردان تهی*، 3)
    حافظه.آزادسازی(buf)
    ساکس.بستن نشست یو دی پی(session)

    ناپایا four := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
    four.نسخه = ساکس.ساکس۴
    سرچاپ "socks4 has no udp:"، ساکس.ایجاد نشست یو دی پی(four).موفق
    ساکس.توقف(server)
پایان
خروجیassociated: true 127.0.0.1 sent: 12 received: 12 from 127.0.0.1 true datagram one bytes sent: 3 socks4 has no udp: false

خروجی Outbound

ساختار خروجی
آنچه یک تابع بازخوان اتصال برمی‌گرداند: مقصد به دست آمد یا نه، کد پاسخی که باید برگردد و جریان.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی به مقصد رسید.
کدcodeصحیح = 1کد پاسخ SOCKS که به کارخواه داده می‌شود. پیش‌فرض ۱، شکست کلی.
خطاerrرشته = ""دلیل خوانا، برای گزارش‌ها.
جریانstreamdyn تونل.جریانجریان به مقصد وقتی موفق درست است.
نشانی محلیboundنشانینشانی محلی اتصال خروجی که به کارخواه گزارش می‌شود.
net-socks-Policy.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل

تابع echo_conn(arg: صحیح۶۴):
    c := تی سی پی.اتصال از توصیف‌گر(arg)
    تا درست:
        data := تی سی پی.خواندن(c، 4096)
        اگر data.طول() برابر 0:
            بشکن
        پایان
        تی سی پی.نوشتن(c، data)
    پایان
    تی سی پی.بستن(c)
پایان

تابع echo_accept(arg: صحیح۶۴):
    srv := تی سی پی.سرور { توصیفگر = arg }
    تا درست:
        c := تی سی پی.پذیرش(srv)
        اگر وارونه تی سی پی.اتصال معتبر(c):
            بشکن
        پایان
        ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
    پایان
پایان

تابع start_echo(): صحیح:
    listener := تی سی پی.پیوند(0)
    ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
    برگشت تی سی پی.درگاه(listener)
پایان

تابع say(label: رشته، r: ساکس.نتیجه اتصال):
    سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان

تابع ریشه:
    echo := start_echo()

    ناپایا routed := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(routed، درست)
    ساکس.تعیین اتصال به مقصد(routed، (host: رشته، _port: صحیح): اگر host برابر "echo.internal": برگشت ساکس.اتصال مستقیم("127.0.0.1"، echo، 2000) پایان برگشت ساکس.خروجی { موفق = نادرست، کد = ساکس.کد شبکه در دسترس نیست، خطا = "no route" } پایان)
    routed_server := ساکس.شروع(routed)
    client := ساکس.کلاینت جدید("127.0.0.1"، routed_server.درگاه)
    say("known name"، ساکس.اتصال(client، "echo.internal"، 1))
    say("unknown name"، ساکس.اتصال(client، "other.internal"، 1))
    ساکس.توقف(routed_server)

    ناپایا acl := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(acl، درست)
    acl.اجازه = (cmd: صحیح، _host: رشته، port: صحیح): برگشت وارونه (cmd برابر ساکس.فرمان اتصال و port برابر 25) پایان
    acl_server := ساکس.شروع(acl)
    acl_client := ساکس.کلاینت جدید("127.0.0.1"، acl_server.درگاه)
    say("allowed"، ساکس.اتصال(acl_client، "127.0.0.1"، echo))
    say("port 25"، ساکس.اتصال(acl_client، "127.0.0.1"، 25))
    ساکس.توقف(acl_server)

    ناپایا blocked := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(blocked، درست)
    ساکس.تعیین شماره‌گیر(blocked، تونل.مسدود())
    blocked_server := ساکس.شروع(blocked)
    say("block dialer"، ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، blocked_server.درگاه)، "127.0.0.1"، echo))
    ساکس.توقف(blocked_server)

    ناپایا direct := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(direct، درست)
    ساکس.تعیین شماره‌گیر(direct، تونل.مستقیم())
    direct_server := ساکس.شروع(direct)
    say("direct dialer"، ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، direct_server.درگاه)، "127.0.0.1"، echo))
    ساکس.توقف(direct_server)
پایان
خروجیknown name: ok=true code=0 unknown name: ok=false code=3 network unreachable allowed: ok=true code=0 port 25: ok=false code=2 connection not allowed by ruleset block dialer: ok=false code=4 host unreachable direct dialer: ok=true code=0

آمار رله RelayStats

ساختار آمار رله
رله در هر جهت چند بایت جابه‌جا کرد.
نامانگلیسیگونهتوضیح
از اول به دومa_to_bصحیح۶۴ = 0بایت‌ها از جریان اول به دوم.
از دوم به اولb_to_aصحیح۶۴ = 0بایت‌ها از جریان دوم به اول.
net-socks-Relay.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تونل
واردسازی استخر

تابع job(a: پویا تونل.جریان، b: پویا تونل.جریان):
    stats := ساکس.رله(a، b، 2000)
    سرچاپ "relayed"، stats.از اول به دوم، stats.از دوم به اول
پایان

تابع ریشه:
    near := تونل.لوله جدید()
    far := تونل.لوله جدید()
    client := تونل.سر اول لوله(near)
    left := تونل.سر دوم لوله(near)
    right := تونل.سر اول لوله(far)
    server := تونل.سر دوم لوله(far)

    workers := استخر.جدید کشسان(1 برگردان صحیح۶۴، 2 برگردان صحیح۶۴، 2 برگردان صحیح۶۴)
    استخر.ارسال(workers، (): job(left، right) پایان)
    client.نوشتن("hello")
    سرچاپ server.خواندن(100)
    server.نوشتن("world!")
    سرچاپ client.خواندن(100)
    client.بستن()
    استخر.انتظار(workers)
    استخر.توقف(workers)
پایان
خروجیhello world! relayed 5 6

نشانی Address

ساختار نشانی
یک میزبان و درگاه آن‌طور که SOCKS می‌بیند: نوع نشانی، متن میزبان و درگاه.
نامانگلیسیگونهتوضیح
نوعkindصحیح = 0نوع آی‌پی۴، نوع دامنه یا نوع آی‌پی۶.
میزبانhostرشته = ""نام میزبان یا متن IP.
درگاهportصحیح = 0درگاه.
net-socks-Codec.salam
// زبان: فارسی
واردسازی شبکه.ساکس

تابع ریشه:
    methods := وکتور {} برگردان وکتور<طبیعی۸>
    methods.بیفزا(0 برگردان طبیعی۸)
    methods.بیفزا(2 برگردان طبیعی۸)
    سرچاپ "greeting   "، ساکس.به هگز(ساکس.رمزگذاری سلام(methods))
    سرچاپ "choice     "، ساکس.به هگز(ساکس.رمزگذاری انتخاب روش(ساکس.احراز هویت نام کاربری))
    سرچاپ "auth       "، ساکس.به هگز(ساکس.رمزگذاری درخواست احراز هویت("alice"، "pw"))
    سرچاپ "auth ok    "، ساکس.به هگز(ساکس.رمزگذاری پاسخ احراز هویت(درست))

    target := ساکس.نشانی جدید("example.com"، 443)
    سرچاپ target.نوع برابر ساکس.نوع دامنه، ساکس.دسته‌بندی میزبان("10.1.2.3") برابر ساکس.نوع آی‌پی۴، ساکس.دسته‌بندی میزبان("::1") برابر ساکس.نوع آی‌پی۶
    request := ساکس.رمزگذاری درخواست(ساکس.فرمان اتصال، target)
    سرچاپ "request    "، ساکس.به هگز(request)
    ناپایا parsed := ساکس.درخواست {}
    سرچاپ ساکس.رمزگشایی درخواست(request، parsed)، parsed.فرمان برابر ساکس.فرمان اتصال، parsed.نشانی.میزبان، parsed.نشانی.درگاه
    ناپایا partial := وکتور {} برگردان وکتور<طبیعی۸>
    تکرار 5 در i:
        partial.بیفزا(request[i])
    پایان
    سرچاپ "short      "، ساکس.رمزگشایی درخواست(partial، parsed)

    reply := ساکس.رمزگذاری پاسخ(ساکس.کد موفق، ساکس.نشانی جدید("10.0.0.1"، 1080))
    سرچاپ "reply      "، ساکس.به هگز(reply)
    ناپایا answer := ساکس.پاسخ {}
    سرچاپ ساکس.رمزگشایی پاسخ(reply، answer)، answer.کد، answer.نشانی.میزبان، ساکس.متن پاسخ(answer.کد)
    سرچاپ ساکس.متن پاسخ(ساکس.کد اتصال رد شد)، "|"، ساکس.متن پاسخ(ساکس.کد ساکس۴ رد شد)

    ناپایا ip := وکتور {} برگردان وکتور<طبیعی۸>
    سرچاپ ساکس.تجزیه آی‌پی۴("192.168.1.20"، ip)، ساکس.قالب آی‌پی۴(ip، 0)
    ناپایا ip6 := وکتور {} برگردان وکتور<طبیعی۸>
    سرچاپ ساکس.تجزیه آی‌پی۶("2001:db8::1"، ip6)، ساکس.قالب آی‌پی۶(ip6، 0)
    encoded := ساکس.رمزگذاری نشانی(target)
    ناپایا back := ساکس.نشانی {}
    سرچاپ ساکس.رمزگشایی نشانی(encoded، 0، back)، back.میزبان

    udp := ساکس.رمزگذاری سرآیند یو دی پی(target، 0)
    سرچاپ "udp header "، ساکس.به هگز(udp)
    ناپایا header := ساکس.سرآیند یو دی پی {}
    سرچاپ ساکس.رمزگشایی سرآیند یو دی پی(udp، header)، header.قطعه، header.نشانی.میزبان، header.طول سرآیند

    four := ساکس.رمزگذاری درخواست ساکس۴(ساکس.فرمان اتصال، "127.0.0.1"، 80، "bob")
    سرچاپ "socks4 req "، ساکس.به هگز(four)
    ناپایا four_req := ساکس.درخواست {}
    سرچاپ ساکس.رمزگشایی درخواست ساکس۴(four، four_req)، four_req.کاربر، four_req.نشانی.درگاه
    four_reply := ساکس.رمزگذاری پاسخ ساکس۴(ساکس.کد ساکس۴ پذیرفته، "127.0.0.1"، 80)
    سرچاپ "socks4 rep "، ساکس.به هگز(four_reply)
    ناپایا four_ans := ساکس.پاسخ {}
    سرچاپ ساکس.رمزگشایی پاسخ ساکس۴(four_reply، four_ans)، four_ans.کد
    سرچاپ ساکس.نسخه ساکس۵، ساکس.نسخه ساکس۴، ساکس.بدون احراز هویت، ساکس.روش پذیرفتنی نیست، ساکس.فرمان پیوند، ساکس.فرمان یو دی پی، ساکس.نوع آی‌پی۴
    سرچاپ ساکس.کد خطای کلی، ساکس.کد غیرمجاز، ساکس.ساکس۴ای
پایان
خروجیgreeting 05020002 choice 0502 auth 0105616c696365027077 auth ok 0100 true true true request 050100030b6578616d706c652e636f6d01bb 18 true example.com 443 short 0 reply 050000010a0000010438 10 0 10.0.0.1 succeeded connection refused | request rejected or failed true 192.168.1.20 true 2001:db8::1 15 example.com udp header 000000030b6578616d706c652e636f6d01bb true 0 example.com 18 socks4 req 040100507f000001626f6200 12 bob 80 socks4 rep 005a00507f000001 true 90 5 4 0 255 2 3 1 1 2 40

درخواست Request

ساختار درخواست
یک درخواست کارخواه رمزگشایی‌شده: نسخه، فرمان و مقصد.
نامانگلیسیگونهتوضیح
نسخهversionصحیح = 0نسخه ساکس۵ یا نسخه ساکس۴.
فرمانcmdصحیح = 0فرمان اتصال، فرمان پیوند یا فرمان یو دی پی.
نشانیaddrنشانیمقصد.
کاربرuserرشته = ""شناسه‌ی کاربر در درخواست SOCKS4.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

پاسخ Reply

ساختار پاسخ
یک پاسخ کارساز رمزگشایی‌شده: نسخه، کد و نشانی‌ای که گزارش می‌دهد.
نامانگلیسیگونهتوضیح
نسخهversionصحیح = 0نسخه‌ی پاسخ.
کدcodeصحیح = 0کد پاسخ.
نشانیaddrنشانینشانی درون پاسخ.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

سرآیند یو دی پی UDPHeader

ساختار سرآیند یو دی پی
سرآیندی که پیش از هر دیتاگرامِ عبوری از رله‌ی UDP در SOCKS5 می‌آید.
نامانگلیسیگونهتوضیح
قطعهfragصحیح = 0شماره‌ی قطعه. فقط ۰ (بدون تکه‌تکه‌شدن) پشتیبانی می‌شود.
نشانیaddrنشانیمقصد یا مبدأ دیتاگرام.
طول سرآیندlengthصحیح = 0سرآیند چند بایت گرفت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

پیکربندی سرور ServerConfig

ساختار پیکربندی سرور
تنظیمات یک کارساز SOCKS: درگاه، احراز هویت، فرمان‌های مجاز، شیوه‌ی رسیدن به مقصدها و حدهای زمانی. از پیکربندی سرور جدید شروع کنید.
نامانگلیسیگونهتوضیح
درگاهportصحیح = 0درگاهی که روی آن گوش داده می‌شود؛ ۰ یک درگاه آزاد برمی‌گزیند.
نیاز به احراز هویتrequire_authمنطقی = نادرستدرست وقتی کارخواه‌ها باید وارد شوند. افزودن کاربر و تعیین احراز هویت آن را روشن می‌کنند.
کاربرانusersنگاشت<رشته، رشته>نام‌های کاربری و گذرواژه‌های پذیرفته‌شده.
احراز هویتauthتابع(رشته، رشته): منطقیبررسی سفارشی (user, password) -> bool که به جای کاربران به کار می‌رود. با تعیین احراز هویت تعیین می‌شود.
دارای احراز هویت سفارشیhas_authمنطقی = نادرستدرست وقتی احراز هویت به کار می‌رود.
اجازه ساکس۴allow_v4منطقی = درستدرست یعنی SOCKS4 و SOCKS4a پذیرفته شود. پیش‌فرض درست. کارسازی که گذرواژه بخواهد SOCKS4 را در هر حال رد می‌کند.
اجازه پیوندallow_bindمنطقی = نادرستدرست یعنی فرمان BIND مجاز باشد. پیش‌فرض نادرست، چون BIND برای کارخواه یک درگاه شنود باز می‌کند.
اجازه یو دی پیallow_udpمنطقی = درستدرست یعنی نشست UDP ASSOCIATE مجاز باشد. پیش‌فرض درست.
میزبان پیوندbind_hostرشته = "127.0.0.1"نشانی‌ای که سرور و سوکت‌های UDP و BIND به آن بسته می‌شوند: پیش‌فرض 127.0.0.1، برای IPv6 loopback مقدار ::1 یا [::1]، برای IPv4 و IPv6 مقدار ::، و 0.0.0.0 برای همه‌ی رابط‌های IPv4.
مهلت دست‌دهی میلی‌ثانیهhandshake_timeout_msصحیح = 10000کارخواه چند میلی‌ثانیه وقت دارد دست‌دهی را تمام کند. پیش‌فرض ۱۰۰۰۰.
مهلت بی‌کاری میلی‌ثانیهidle_timeout_msصحیح = 0اتصال رله‌شده را پس از این همه میلی‌ثانیه سکوت قطع کن. ۰، پیش‌فرض، یعنی هرگز.
اتصال به مقصدconnectتابع(رشته، صحیح): خروجیتابع بازخوانی که به مقصد می‌رسد: (host, port) -> خروجی. پیش‌فرض اتصال مستقیم. با تعیین اتصال به مقصد یا تعیین شماره‌گیر تعیین می‌شود.
اجازهallowتابع(صحیح، رشته، صحیح): منطقییک قاعده‌ی دسترسی (command, host, port) -> bool که پیش از هر درخواست پرسیده می‌شود؛ نادرست با «غیرمجاز» پاسخ می‌دهد. پیش‌فرض همه چیز را مجاز می‌داند.
سیاست مقصدpolicyتونل.سیاست مقصدکدام مقصدها قابل دسترسی‌اند. به‌طور پیش‌فرض نشانی‌های حلقه محلی، خصوصی، پیوند محلی، فراداده و دیگر نشانی‌های ویژه رد می‌شوند. به DestPolicy نگاه کنید.
اتصال سفارشی داردhas_connectمنطقی = نادرستدرست وقتی یک اتصال‌دهنده‌ی سفارشی تعیین شده است. آن‌گاه سیاست فقط نام‌ها و نشانی‌های صریح را می‌سنجد و اتصال‌دهنده باید خودش امن تفکیک کند.
بیشینه اتصال همزمانmax_connectionsصحیح = 1024بیشترین شمار اتصال همزمان؛ بیشتر از آن بسته می‌شود (ساکس) یا با ۵۰۳ پاسخ داده می‌شود (اچ‌تی‌تی‌پی). پیش‌فرض ۱۰۲۴ است و ۰ سقف را برمی‌دارد.
بیشینه دست دادن مبداmax_per_sourceصحیح = 32بیشترین دست‌دهی‌های هم‌زمان در جریان از یک نشانی مبدا. پیش‌فرض ۳۲ است و ۰ حد را برمی‌دارد.
مهلت کل دست‌دهیhandshake_deadline_msصحیح = 10000کل زمانی که یک اتصال برای پایان دست‌دهی دارد، به میلی‌ثانیه، هر قدر هم آهسته بفرستد. پیش‌فرض ۱۰۰۰۰ است و ۰ آن را خاموش می‌کند.
net-socks-Auth.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی

تابع echo_conn(arg: صحیح۶۴):
    c := تی سی پی.اتصال از توصیف‌گر(arg)
    تا درست:
        data := تی سی پی.خواندن(c، 4096)
        اگر data.طول() برابر 0:
            بشکن
        پایان
        تی سی پی.نوشتن(c، data)
    پایان
    تی سی پی.بستن(c)
پایان

تابع echo_accept(arg: صحیح۶۴):
    srv := تی سی پی.سرور { توصیفگر = arg }
    تا درست:
        c := تی سی پی.پذیرش(srv)
        اگر وارونه تی سی پی.اتصال معتبر(c):
            بشکن
        پایان
        ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
    پایان
پایان

تابع start_echo(): صحیح:
    listener := تی سی پی.پیوند(0)
    ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
    برگشت تی سی پی.درگاه(listener)
پایان

تابع say(label: رشته، r: ساکس.نتیجه اتصال):
    سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان

تابع ریشه:
    echo := start_echo()

    ناپایا config := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(config، درست)
    ساکس.افزودن کاربر(config، "alice"، "s3cret")
    سرچاپ config.نیاز به احراز هویت
    server := ساکس.شروع(config)

    say("right password"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، server.درگاه، "alice"، "s3cret")، "127.0.0.1"، echo))
    say("wrong password"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، server.درگاه، "alice"، "nope")، "127.0.0.1"، echo))
    say("no credentials"، ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)، "127.0.0.1"، echo))
    ساکس.توقف(server)

    ناپایا custom := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(custom، درست)
    ساکس.تعیین احراز هویت(custom، (user: رشته، password: رشته): برگشت user برابر "bob" و password برابر "pw" پایان)
    سرچاپ custom.دارای احراز هویت سفارشی
    second := ساکس.شروع(custom)
    say("callback accepts"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، second.درگاه، "bob"، "pw")، "127.0.0.1"، echo))
    say("callback refuses"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، second.درگاه، "bob"، "xx")، "127.0.0.1"، echo))
    ساکس.توقف(second)
پایان
خروجیtrue right password: ok=true code=0 wrong password: ok=false code=2 authentication failed no credentials: ok=false code=2 no acceptable auth method true callback accepts: ok=true code=0 callback refuses: ok=false code=2 authentication failed

سرور Server

ساختار سرور
یک کارساز SOCKS در حال اجرا. شروع آن را برمی‌گرداند و توقف پایانش می‌دهد.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی درگاه بسته شد و کارساز در حال اجراست.
درگاهportصحیح = 0درگاهی که روی آن گوش می‌دهد؛ وقتی ۰ خواسته‌اید به کار می‌آید.
میزبانhostرشته = ""نشانی‌ای که کارساز روی آن گوش می‌دهد.
شنوندهlistenerتی سی پی.سرورشنونده‌ی TCP زیرین.
پرچم توقفstop_cellصحیح۶۴*پرچمی که توقف پاکش می‌کند تا حلقه‌ی پذیرش تمام شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

ورودی ساکس۵ Socks5Inbound

ساختار ورودی ساکس۵
یک کارساز SOCKS5 برای تونل.پذیرنده: خوش‌آمدگویی را می‌خواند، احراز هویت می‌کند و درخواست را از یک جریان می‌خواند، پس می‌تواند در یک تونل.پروتکل ترکیبی یا پشت تونل.شنود تی سی پی بنشیند. با ورودی جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
پیکربندیconfigپیکربندی سرورتنظیمات کارساز: کاربرها، فرمان‌های مجاز و حدها.
net-socks-Inbound.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل

تابع echo_conn(arg: صحیح۶۴):
    c := تی سی پی.اتصال از توصیف‌گر(arg)
    تا درست:
        data := تی سی پی.خواندن(c، 4096)
        اگر data.طول() برابر 0:
            بشکن
        پایان
        تی سی پی.نوشتن(c، data)
    پایان
    تی سی پی.بستن(c)
پایان

تابع echo_accept(arg: صحیح۶۴):
    srv := تی سی پی.سرور { توصیفگر = arg }
    تا درست:
        c := تی سی پی.پذیرش(srv)
        اگر وارونه تی سی پی.اتصال معتبر(c):
            بشکن
        پایان
        ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
    پایان
پایان

تابع start_echo(): صحیح:
    listener := تی سی پی.پیوند(0)
    ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
    برگشت تی سی پی.درگاه(listener)
پایان

تابع ریشه:
    echo := start_echo()
    ناپایا config := ساکس.پیکربندی سرور جدید(0)
    ساکس.افزودن کاربر(config، "u"، "p")
    mixed_config := ساکس.پیکربندی سرور جدید(0)

    ناپایا mixed := تونل.ترکیبی جدید()
    تونل.تنظیم ساکس۵ ترکیبی(mixed، ساکس.ورودی جدید(config))
    تونل.تنظیم ساکس۴ ترکیبی(mixed، ساکس.ورودی جدید ساکس۴(mixed_config))
    سرچاپ ساکس.ورودی جدید(config).نام()، ساکس.ورودی جدید ساکس۴(mixed_config).نام()

    forward := تونل.انتقال‌دهنده جدید(تونل.مستقیم()، mixed)
    inbound := تونل.شنود تی سی پی(0)
    تونل.سرویس‌دهی پس‌زمینه(inbound، mixed، forward)

    five := ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، inbound.درگاه، "u"، "p")، "127.0.0.1"، echo)
    five.جریان.نوشتن("five")
    سرچاپ five.موفق، five.جریان.خواندن(100)
    five.جریان.بستن()
    سرچاپ "wrong password:"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، inbound.درگاه، "u"، "x")، "127.0.0.1"، echo).موفق

    ناپایا four := ساکس.کلاینت جدید("127.0.0.1"، inbound.درگاه)
    four.نسخه = ساکس.ساکس۴
    سرچاپ "socks4 with auth required:"، ساکس.اتصال(four، "127.0.0.1"، echo).کد
    inbound.توقف()

    listener := تی سی پی.پیوند(0)
    port := تی سی پی.درگاه(listener)
    ساکس.برو(serve_once، listener.توصیفگر برگردان تهی*)
    direct := ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، port)، "127.0.0.1"، echo)
    direct.جریان.نوشتن("handled by hand")
    سرچاپ direct.جریان.خواندن(100)
    direct.جریان.بستن()
پایان

تابع serve_once(arg: صحیح۶۴):
    listener := تی سی پی.سرور { توصیفگر = arg }
    c := تی سی پی.پذیرش(listener)
    ساکس.رسیدگی(ساکس.پیکربندی سرور جدید(0)، تونل.پوشاندن تی سی پی(c))
پایان
خروجیsocks5 socks4 true five wrong password: false socks4 with auth required: 90 handled by hand

نام Name

تابع نام(): رشته
socks5 را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

دست‌دهی Handshake

تابع دست‌دهی(s: dyn تونل.جریان): تونل.نشست
خوش‌آمدگویی SOCKS5، گام اختیاری نام کاربری و گذرواژه و درخواست را اجرا می‌کند. یک تونل.نشست با مقصد برمی‌گرداند، یا پس از فرستادن پاسخ خطای درست یک نشست ناموفق.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

پاسخ Reply

تابع پاسخ(s: dyn تونل.جریان، sess: تونل.نشست، ok: منطقی)
پاسخ پایانی SOCKS5 را می‌فرستد: موفق، یا میزبان در دسترس نیست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

ورودی ساکس۴ Socks4Inbound

ساختار ورودی ساکس۴
یک کارساز SOCKS4 و SOCKS4a برای تونل.پذیرنده. با ورودی جدید ساکس۴ ساخته می‌شود.
نامانگلیسیگونهتوضیح
پیکربندیconfigپیکربندی سرورتنظیمات کارساز.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

نام Name

تابع نام(): رشته
socks4 را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

دست‌دهی Handshake

تابع دست‌دهی(s: dyn تونل.جریان): تونل.نشست
یک درخواست SOCKS4 یا SOCKS4a را می‌خواند. SOCKS4 گذرواژه ندارد، پس کارسازی که گذرواژه بخواهد آن را رد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

پاسخ Reply

تابع پاسخ(s: dyn تونل.جریان، _sess: تونل.نشست، ok: منطقی)
پاسخ SOCKS4 را می‌فرستد: پذیرفته (۹۰) یا ردشده (۹۱).

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

رابط ساکس SocksConnector

ساختار رابط ساکس
یک گام SOCKS از یک تونل.زنجیره: به یک کارساز SOCKS وصل می‌شود و از آن می‌خواهد ادامه بدهد. با رابط جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
کلاینتclientکلاینتتنظیمات کارخواه: نشانی کارساز، نسخه و اعتبارنامه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam

کارساز Server

تابع کارساز(): تونل.نشانی
نشانی کارساز SOCKS.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam

دست‌دهی Handshake

تابع دست‌دهی(s: dyn تونل.جریان، target: تونل.نشانی): منطقی
دست‌دهی SOCKS را روی جریان باز برای یک مقصد اجرا می‌کند. درست وقتی کارساز موافقت کرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam

نام Name

تابع نام(): رشته
socks5 یا socks4 را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam

پایاها و متغیرها

نسخه‌های کارخواه Socks…

مقدارهای نسخه.
نامانگلیسیمقدار
ساکس۵Socks55
ساکس۴Socks44
ساکس۴ایSocks4a40
net-socks-Socks4.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی

تابع echo_conn(arg: صحیح۶۴):
    c := تی سی پی.اتصال از توصیف‌گر(arg)
    تا درست:
        data := تی سی پی.خواندن(c، 4096)
        اگر data.طول() برابر 0:
            بشکن
        پایان
        تی سی پی.نوشتن(c، data)
    پایان
    تی سی پی.بستن(c)
پایان

تابع echo_accept(arg: صحیح۶۴):
    srv := تی سی پی.سرور { توصیفگر = arg }
    تا درست:
        c := تی سی پی.پذیرش(srv)
        اگر وارونه تی سی پی.اتصال معتبر(c):
            بشکن
        پایان
        ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
    پایان
پایان

تابع start_echo(): صحیح:
    listener := تی سی پی.پیوند(0)
    ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
    برگشت تی سی پی.درگاه(listener)
پایان

تابع say(label: رشته، r: ساکس.نتیجه اتصال):
    سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان

تابع ریشه:
    echo := start_echo()
    ناپایا server_cfg := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(server_cfg، درست)
    server := ساکس.شروع(server_cfg)

    ناپایا client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
    client.نسخه = ساکس.ساکس۴
    r := ساکس.اتصال(client، "127.0.0.1"، echo)
    say("socks4 by address"، r)
    r.جریان.نوشتن("four")
    سرچاپ r.جریان.خواندن(100)
    r.جریان.بستن()

    client.نسخه = ساکس.ساکس۴ای
    client.نام کاربری = "tester"
    named := ساکس.اتصال(client، "localhost"، echo)
    say("socks4a by name"، named)
    named.جریان.بستن()
    say("socks4 refused"، ساکس.اتصال(client، "127.0.0.1"، تی سی پی.درگاه آزاد()))
    ساکس.توقف(server)

    ناپایا config := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(config، درست)
    config.اجازه ساکس۴ = نادرست
    off := ساکس.شروع(config)
    ناپایا four := ساکس.کلاینت جدید("127.0.0.1"، off.درگاه)
    four.نسخه = ساکس.ساکس۴
    سرچاپ "socks4 switched off:"، ساکس.اتصال(four، "127.0.0.1"، echo).موفق
    ساکس.توقف(off)
پایان
خروجیsocks4 by address: ok=true code=90 four socks4a by name: ok=true code=90 socks4 refused: ok=false code=91 request rejected or failed socks4 switched off: false

بایت‌های نسخه Ver…

بایت نخست یک درخواست یا پاسخ روی سیم.
نامانگلیسیمقدار
نسخه ساکس۵VerSocks55
نسخه ساکس۴VerSocks44

روش‌های احراز هویت Auth…

روش‌هایی که در خوش‌آمدگویی SOCKS5 پیشنهاد می‌شوند.
نامانگلیسیمقدار
بدون احراز هویتAuthNone0
احراز هویت نام کاربریAuthUserPass2
روش پذیرفتنی نیستAuthNoAcceptable255

فرمان‌ها Cmd…

فرمان‌های فرمان.
نامانگلیسیمقدار
فرمان اتصالCmdConnect1
فرمان پیوندCmdBind2
فرمان یو دی پیCmdUDPAssociate3

نوع‌های نشانی Atyp…

مقدارهای نوع.
نامانگلیسیمقدار
نوع آی‌پی۴AtypIPv41
نوع دامنهAtypDomain3
نوع آی‌پی۶AtypIPv64

کدهای پاسخ SOCKS5 Rep…

کدهای یک پاسخ SOCKS5 همان‌طور که کد برمی‌گرداند.
نامانگلیسیمقدار
کد موفقRepSucceeded0
کد خطای کلیRepGeneralFailure1
کد غیرمجازRepNotAllowed2
کد شبکه در دسترس نیستRepNetUnreachable3
کد میزبان در دسترس نیستRepHostUnreachable4
کد اتصال رد شدRepConnRefused5
کد زمان تمامRepTTLExpired6
کد فرمان پشتیبانی نمی‌شودRepCmdNotSupported7
کد نوع نشانی پشتیبانی نمی‌شودRepAtypNotSupported8

کدهای پاسخ SOCKS4 Rep4…

کدهای یک پاسخ SOCKS4.
نامانگلیسیمقدار
کد ساکس۴ پذیرفتهRep4Granted90
کد ساکس۴ رد شدRep4Rejected91
کد ساکس۴ بدون شناساییRep4NoIdentd92
کد ساکس۴ کاربر ناشناسRep4BadUser93

تابع‌ها

کلاینت جدید NewClient

تابع کلاینت جدید(host: رشته، port: صحیح): کلاینت
یک کارخواه SOCKS5 برای یک پراکسی، بدون اعتبارنامه می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

کلاینت جدید با احراز هویت NewClientAuth

تابع کلاینت جدید با احراز هویت(host: رشته، port: صحیح، username: رشته، password: رشته): کلاینت
یک کارخواه SOCKS5 می‌سازد که با نام کاربری و گذرواژه وارد می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Auth.salam

دست‌دهی کلاینت ClientHandshake

تابع دست‌دهی کلاینت(s: dyn تونل.جریان، c: کلاینت، cmd: صحیح، host: رشته، port: صحیح): نتیجه دست‌دهی
یک فرمان SOCKS (CONNECT، BIND یا UDP ASSOCIATE) را روی جریانی که از پیش به یک پراکسی باز است اجرا می‌کند. همین‌طور گام دوم پراکسی روی گام اول اضافه می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam

اتصال Connect

تابع اتصال(c: کلاینت، host: رشته، port: صحیح): نتیجه اتصال
به پراکسی وصل می‌شود، دست‌دهی را برای یک مقصد اجرا می‌کند و جریان را برمی‌گرداند. میزبان می‌تواند نام باشد (پراکسی حلش می‌کند) یا IP.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

شماره‌گیری اتصال DialConn

تابع شماره‌گیری اتصال(c: کلاینت، host: رشته، port: صحیح): تی سی پی.اتصال شبکه
مثل اتصال ولی یک اتصال TCP ساده برای تابع‌های net.tcp برمی‌گرداند. در شکست اتصال خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

پیوند درخواست Bind

تابع پیوند درخواست(c: کلاینت، host: رشته، port: صحیح): نتیجه اتصال
از پراکسی می‌خواهد منتظر یک اتصال ورودی بماند (SOCKS BIND)، همان‌طور که حالت فعال FTP می‌خواهد. پاسخ اول می‌گوید کجا گوش می‌دهد؛ برای پاسخ دوم پذیرش پیوند را صدا بزنید.
net-socks-Bind.salam
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی

تابع ریشه:
    ناپایا config := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(config، درست)
    config.اجازه پیوند = درست
    server := ساکس.شروع(config)
    client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)

    first := ساکس.پیوند درخواست(client، "127.0.0.1"، 0)
    سرچاپ "bind accepted:"، first.موفق، first.کد، first.نشانی محلی.درگاه بزرگتر 0
    peer := تی سی پی.شماره گیری("127.0.0.1"، first.نشانی محلی.درگاه)
    second := ساکس.پذیرش پیوند(first.جریان، client)
    سرچاپ "peer connected:"، second.موفق
    تی سی پی.نوشتن(peer، "from the inbound peer")
    سرچاپ first.جریان.خواندن(100)
    first.جریان.نوشتن("reply to the peer")
    سرچاپ تی سی پی.خواندن(peer، 100)
    تی سی پی.بستن(peer)
    first.جریان.بستن()
    ساکس.توقف(server)

    ناپایا plain_cfg := ساکس.پیکربندی سرور جدید(0)
    ساکس.اجازه آدرس‌های خصوصی(plain_cfg، درست)
    plain := ساکس.شروع(plain_cfg)
    off := ساکس.پیوند درخواست(ساکس.کلاینت جدید("127.0.0.1"، plain.درگاه)، "127.0.0.1"، 0)
    سرچاپ "bind not enabled:"، off.موفق، off.کد، off.خطا
    ساکس.توقف(plain)
پایان
خروجیbind accepted: true 0 true peer connected: true from the inbound peer reply to the peer bind not enabled: false 7 command not supported

پذیرش پیوند BindAccept

تابع پذیرش پیوند(s: dyn تونل.جریان، c: کلاینت): نتیجه دست‌دهی
منتظر پاسخ دوم BIND می‌ماند که وقتی همتایی به درگاه بسته‌شده وصل می‌شود می‌رسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Bind.salam

ایجاد نشست یو دی پی Associate

تابع ایجاد نشست یو دی پی(c: کلاینت): نشست یو دی پی
یک نشست UDP ASSOCIATE در SOCKS5 باز می‌کند. SOCKS4 UDP ندارد، پس برای آن نسخه شکست می‌خورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam

ارسال بایت یو دی پی UDPSendBytes

تابع ارسال بایت یو دی پی(u: نشست یو دی پی، host: رشته، port: صحیح، ptr: تهی*، n: صحیح): صحیح
یک دیتاگرام را از حافظه از راه رله به یک مقصد می‌فرستد. شمار بایت‌های بار فرستاده‌شده را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam

ارسال یو دی پی UDPSend

تابع ارسال یو دی پی(u: نشست یو دی پی، host: رشته، port: صحیح، data: رشته): صحیح
یک دیتاگرام متنی را از راه رله به یک مقصد می‌فرستد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam

دریافت بایت یو دی پی UDPReceiveBytes

تابع دریافت بایت یو دی پی(u: نشست یو دی پی، buf: تهی*، max: صحیح، from &: نشانی): صحیح
یک دیتاگرام را در یک بافر دریافت می‌کند و می‌گوید از که آمده. اندازه‌ی بار را برمی‌گرداند، یا ۰ و کمتر در مهلت یا خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam

تنظیم مهلت یو دی پی UDPSetTimeout

تابع تنظیم مهلت یو دی پی(u: نشست یو دی پی، millis: صحیح)
تعیین می‌کند دریافت چند میلی‌ثانیه صبر کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam

بستن نشست یو دی پی CloseUDP

تابع بستن نشست یو دی پی(u: نشست یو دی پی)
سوکت UDP و اتصال کنترل را می‌بندد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam

برو Go

تابع برو(fn: صحیح۶۴، arg: تهی*): منطقی
یک تابع را روی یک نخ تازه شروع می‌کند. تابع یک آرگومان صحیح می‌گیرد، معمولا یک اشاره‌گر یا توصیفگر پرونده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam

رله Relay

تابع رله(a: dyn تونل.جریان، b: dyn تونل.جریان، idle_ms: صحیح): آمار رله
داده را در دو جهت بین دو جریان کپی می‌کند تا یکی تمام شود. با زمان بیکاری به میلی‌ثانیه، اتصال ساکت قطع می‌شود؛ ۰ یعنی بی‌حد. در پایان هر دو جریان خاموش می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Relay.salam

اتصال مستقیم DirectConnect

تابع اتصال مستقیم(host: رشته، port: صحیح، timeout_ms: صحیح): خروجی
تابع بازخوان پیش‌فرض اتصال: یک اتصال TCP با مهلت به یک میزبان و درگاه باز می‌کند و آن را به شکل خروجی می‌پوشاند. نام حل‌نشدنی «میزبان در دسترس نیست» می‌دهد و ردشدن «اتصال رد شد».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Policy.salam

اتصال با سیاست PolicyConnect

تابع اتصال با سیاست(p: تونل.سیاست مقصد، host: رشته، port: صحیح، timeout_ms: صحیح): خروجی
با یک سیاست مقصد به میزبان و درگاه وصل می‌شود: نام‌ها یک بار تفکیک می‌شوند، همه‌ی پاسخ‌ها سنجیده می‌شوند و به نشانی سنجیده‌شده وصل می‌شود. مقصد ردشده کد ۲ می‌دهد.

تجزیه آی‌پی۴ ParseIPv4

تابع تجزیه آی‌پی۴(s: رشته، out &: وکتور<طبیعی۸>): منطقی
متن IPv4 را به چهار بایت تجزیه می‌کند که به یک بردار اضافه می‌شود. اگر نشانی نبود نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

تجزیه آی‌پی۶ ParseIPv6

تابع تجزیه آی‌پی۶(s: رشته، out &: وکتور<طبیعی۸>): منطقی
متن IPv6 را به شانزده بایت تجزیه می‌کند که به یک بردار اضافه می‌شود. اگر نشانی نبود نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

قالب آی‌پی۴ FormatIPv4

تابع قالب آی‌پی۴(v: وکتور<طبیعی۸>، off: صحیح): رشته
چهار بایت را از یک آفست به شکل متن نقطه‌دار درمی‌آورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

قالب آی‌پی۶ FormatIPv6

تابع قالب آی‌پی۶(v: وکتور<طبیعی۸>، off: صحیح): رشته
شانزده بایت را از یک آفست به شکل متن IPv6 درمی‌آورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

دسته‌بندی میزبان ClassifyHost

تابع دسته‌بندی میزبان(host: رشته): صحیح
برای متن IPv4 مقدار نوع آی‌پی۴، برای IPv6 مقدار نوع آی‌پی۶ و برای هر چیز دیگر نوع دامنه را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

نشانی جدید NewAddress

تابع نشانی جدید(host: رشته، port: صحیح): نشانی
یک نشانی می‌سازد و نوع را از روی متن میزبان برمی‌گزیند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری نشانی EncodeAddress

تابع رمزگذاری نشانی(a: نشانی): وکتور<طبیعی۸>
نشانی را به شکل SOCKS5 می‌نویسد: نوع، میزبان، درگاه. اگر نشانی بد باشد خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگشایی نشانی DecodeAddress

تابع رمزگشایی نشانی(data: وکتور<طبیعی۸>، off: صحیح، out &: نشانی): صحیح
نشانی را از یک بردار در یک آفست می‌خواند. برمی‌گرداند چند بایت گرفت، ۰ وقتی داده‌ی بیشتری لازم است و ۱- وقتی نامعتبر است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری سلام EncodeGreeting

تابع رمزگذاری سلام(methods: وکتور<طبیعی۸>): وکتور<طبیعی۸>
نخستین پیام کارخواه را می‌نویسد: نسخه و فهرست روش‌های احراز هویتی که پیشنهاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری انتخاب روش EncodeMethodChoice

تابع رمزگذاری انتخاب روش(method: صحیح): وکتور<طبیعی۸>
پاسخ کارساز به خوش‌آمدگویی را می‌نویسد: روشی که برگزید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری درخواست احراز هویت EncodeAuthRequest

تابع رمزگذاری درخواست احراز هویت(user: رشته، pass: رشته): وکتور<طبیعی۸>
پیام نام کاربری و گذرواژه‌ی ورود SOCKS5 را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری پاسخ احراز هویت EncodeAuthReply

تابع رمزگذاری پاسخ احراز هویت(ok: منطقی): وکتور<طبیعی۸>
پاسخ ورود کارساز را می‌نویسد: موفق یا ناموفق.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری درخواست EncodeRequest

تابع رمزگذاری درخواست(cmd: صحیح، a: نشانی): وکتور<طبیعی۸>
یک درخواست SOCKS5 برای یک فرمان و یک نشانی می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری پاسخ EncodeReply

تابع رمزگذاری پاسخ(code: صحیح، a: نشانی): وکتور<طبیعی۸>
یک پاسخ SOCKS5 با یک کد و یک نشانی می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگشایی درخواست DecodeRequest

تابع رمزگشایی درخواست(data: وکتور<طبیعی۸>، out &: درخواست): صحیح
یک درخواست SOCKS5 را می‌خواند. بایت‌های مصرف‌شده، ۰ برای ناقص و ۱- برای نامعتبر را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگشایی پاسخ DecodeReply

تابع رمزگشایی پاسخ(data: وکتور<طبیعی۸>، out &: پاسخ): صحیح
یک پاسخ SOCKS5 را می‌خواند. بایت‌های مصرف‌شده، ۰ برای ناقص و ۱- برای نامعتبر را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری سرآیند یو دی پی EncodeUDPHeader

تابع رمزگذاری سرآیند یو دی پی(a: نشانی، frag: صحیح): وکتور<طبیعی۸>
سرآیند رله‌ی UDP را برای یک نشانی و یک شماره‌ی قطعه می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگشایی سرآیند یو دی پی DecodeUDPHeader

تابع رمزگشایی سرآیند یو دی پی(data: وکتور<طبیعی۸>، out &: سرآیند یو دی پی): منطقی
یک سرآیند رله‌ی UDP را می‌خواند. اگر کوتاه یا خراب بود نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری درخواست ساکس۴ Encode4Request

تابع رمزگذاری درخواست ساکس۴(cmd: صحیح، host: رشته، port: صحیح، user: رشته): وکتور<طبیعی۸>
یک درخواست SOCKS4 یا SOCKS4a می‌نویسد. نام میزبان آن را SOCKS4a می‌کند. اگر آرگومان‌ها بیرون از بازه باشند خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگشایی درخواست ساکس۴ Decode4Request

تابع رمزگشایی درخواست ساکس۴(data: وکتور<طبیعی۸>، out &: درخواست): صحیح
یک درخواست SOCKS4 یا SOCKS4a را می‌خواند. بایت‌های مصرف‌شده، ۰ برای ناقص و ۱- برای نامعتبر را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگذاری پاسخ ساکس۴ Encode4Reply

تابع رمزگذاری پاسخ ساکس۴(code: صحیح، host: رشته، port: صحیح): وکتور<طبیعی۸>
پاسخ هشت‌بایتی SOCKS4 را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

رمزگشایی پاسخ ساکس۴ Decode4Reply

تابع رمزگشایی پاسخ ساکس۴(data: وکتور<طبیعی۸>، out &: پاسخ): منطقی
پاسخ هشت‌بایتی SOCKS4 را می‌خواند. اگر کوتاه بود یا بایت نسخه‌اش ۰ نبود نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

متن پاسخ ReplyText

تابع متن پاسخ(code: صحیح): رشته
متن خوانایی برای یک کد پاسخ برمی‌گرداند، مثل connection refused.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

به هگز ToHex

تابع به هگز(v: وکتور<طبیعی۸>): رشته
بایت‌های یک بردار را به شکل هگز با حروف کوچک برمی‌گرداند؛ برای آزمون و گزارش به کار می‌آید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam

پیکربندی سرور جدید NewServerConfig

تابع پیکربندی سرور جدید(port: صحیح): پیکربندی سرور
پیکربندی‌ای برای یک درگاه با پیش‌فرض‌های بالا برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

افزودن کاربر AddUser

تابع افزودن کاربر(cfg &: پیکربندی سرور، user: رشته، pass: رشته)
یک کاربر و گذرواژه اضافه می‌کند و احراز هویت را روشن می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Auth.salam

تعیین احراز هویت SetAuth

تابع تعیین احراز هویت(cfg &: پیکربندی سرور، check: تابع(رشته، رشته): منطقی)
یک بررسی ورود سفارشی تعیین می‌کند و احراز هویت را روشن می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Auth.salam

تعیین اتصال به مقصد SetConnector

تابع تعیین اتصال به مقصد(cfg &: پیکربندی سرور، connect: تابع(رشته، صحیح): خروجی)
تابع بازخوانی را که به مقصدها می‌رسد تعیین می‌کند. برای مسیریابی با نام به کار ببرید، همان‌طور که نمونه می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Policy.salam

تعیین سیاست مقصد SetPolicy

تابع تعیین سیاست مقصد(cfg &: پیکربندی سرور، p: تونل.سیاست مقصد)
سیاست مقصد کارساز را تعیین می‌کند.

اجازه آدرس‌های خصوصی AllowPrivate

تابع اجازه آدرس‌های خصوصی(cfg &: پیکربندی سرور، enabled: منطقی)
دسترسی به نشانی‌های حلقه محلی و خصوصی را می‌دهد. فقط وقتی اثر دارد که کارساز روی حلقه محلی بسته شده باشد؛ روی هر نشانی دیگر نادیده گرفته می‌شود.

رسیدگی Handle

تابع رسیدگی(cfg: پیکربندی سرور، s: dyn تونل.جریان)
یک کارخواه را روی یک جریان باز سرویس می‌دهد: بایت نسخه را می‌خواند و سپس SOCKS5 یا SOCKS4 را اجرا می‌کند. برای گذاشتن کارساز SOCKS روی جریانی که خودتان پذیرفته‌اید به کار ببرید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

شروع Start

تابع شروع(cfg: پیکربندی سرور): سرور
درگاه را می‌بندد و کارخواه‌ها را روی نخ‌های پس‌زمینه سرویس می‌دهد. موفق را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

توقف Stop

تابع توقف(sv: سرور)
پذیرش کارخواه‌های تازه را می‌ایستاند. اتصال‌هایی که در جریان‌اند خودشان تمام می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam

خدمت‌رسانی Serve

تابع خدمت‌رسانی(cfg: پیکربندی سرور): منطقی
یک کارساز را شروع می‌کند و دیگر برنمی‌گردد، برای برنامه‌ای که تنها کارش پراکسی بودن است. اگر درگاه بسته نشد نادرست.

رابط جدید NewConnector

تابع رابط جدید(c: کلاینت): رابط ساکس
از یک کارخواه یک رابط ساکس می‌سازد. آن را با تونل.از طریق یا تونل.افزودن گام به کار ببرید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam

ورودی جدید NewInbound

تابع ورودی جدید(cfg: پیکربندی سرور): ورودی ساکس۵
از یک پیکربندی کارساز یک درون‌سوی SOCKS5 می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

ورودی جدید ساکس۴ NewInbound4

تابع ورودی جدید ساکس۴(cfg: پیکربندی سرور): ورودی ساکس۴
از یک پیکربندی کارساز یک درون‌سوی SOCKS4 می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam

تعیین شماره‌گیر SetDialer

تابع تعیین شماره‌گیر(cfg &: پیکربندی سرور، d: dyn تونل.شماره‌گیر)
کارساز را وادار می‌کند با یک تونل.شماره‌گیر به مقصدها برسد، پس می‌تواند قاعده، زنجیره یا فهرست مسدود به کار ببرد. جای تابع بازخوان اتصال را می‌گیرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-socks-Policy.salam