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

تی سی پی net/tcp

سرور و کارخواه TCP: گوش دادن، وصل شدن، خواندن و نوشتن، TLS و استخر اتصال.

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

TCP پایه‌ی بیشتر پروتکل‌های اینترنت است: یک جریان مطمئن و مرتب از بایت‌ها میان دو برنامه. سرور با پیوند روی یک درگاه گوش می‌دهد و با پذیرش هر کارخواه تازه را می‌گیرد؛ کارخواه با شماره گیری وصل می‌شود.

پذیرش و خواندن تا رسیدن چیزی صبر می‌کنند، پس سروری که با چند کارخواه حرف می‌زند هر اتصال را به یک نخ می‌سپارد، همان‌طور که راهنمای کارگرها نشان می‌دهد. همه‌ی نمونه‌ها روی 127.0.0.1 اجرا می‌شوند و شبکه لازم ندارند.

این بسته را برای پروتکل‌های خودتان و برای گفت‌وگو با سرورهایی به کار ببرید که کارخواهی در کتابخانه‌ی استاندارد ندارند. برای HTTP بسته‌ی اچ تی تی پی، برای پیام‌هایی که نباید شکسته یا مرتب شوند یو دی پی و برای ترافیک دوطرفه‌ی زنده با مرورگرها وب‌سوکت را ببینید. تی ال اس روی اتصالی از همین بسته رمزنگاری می‌افزاید.

اشتباه‌های رایج

  • خواندن خالی سه معنا دارد. طرف مقابل اتصال را بسته، مهلت خواندن گذشته یا خطایی رخ داده است؛ هر سه "" برمی‌گردانند. پیامی که با بایت صفر شروع شود هم خالی برمی‌گردد و متن پس از بایت صفر از دست می‌رود، پس برای داده‌ی دودویی خواندن بایت را به کار ببرید.
  • نوشتن ممکن است فقط بخشی از متن را بفرستد. یک فراخوانی سیستمی انجام می‌دهد و تعداد بایت‌های فرستاده‌شده را برمی‌گرداند. برای داده‌ی بزرگ نتیجه را با طول مقایسه کنید، یا نوشتن بایت را به کار ببرید که تا فرستادن همه چیز تکرار می‌کند.
  • پیام‌ها از هم جدا نمی‌مانند. TCP جریانی از بایت‌هاست؛ پیام‌هایتان را با یک جداکننده یا طول قاب‌بندی کنید، همان‌طور که راهنمای قاب‌بندی می‌کند.
  • پیوند روی همه‌ی رابط‌های IPv4 گوش می‌دهد، نه فقط روی 127.0.0.1، پس سرور آزمایشی از شبکه هم در دسترس است مگر دیواره‌ی آتش جلویش را بگیرد. کارخواه‌های IPv6 به آن نمی‌رسند؛ خود شماره گیری همه‌ی نشانی‌هایی را که یک نام به آن‌ها می‌رسد، از جمله IPv6، امتحان می‌کند.
  • شکست برنامه را متوقف نمی‌کند. پیوند، پذیرش و شماره گیری مقداری با fd برابر ‎-1 برمی‌گردانند؛ معتبر یا اتصال معتبر را بررسی کنید.

پروتکل پرسش و پاسخ

بیشتر پروتکل‌های کوچک نوبتی کار می‌کنند: کارخواه یک درخواست می‌فرستد، سرور یک پاسخ می‌دهد و این رفت و برگشت تا وقتی کارخواه اتصال را ببندد ادامه دارد. سرورِ نمونه‌ی زیر در یک حلقه می‌خواند و وقتی خواندن رشته‌ی خالی برگرداند می‌ایستد؛ TCP بسته شدن اتصال از سوی دیگر را همین‌طور خبر می‌دهد. کارخواه پیش از فرستادن درخواست بعدی منتظر پاسخ می‌ماند، پس هر خواندن درست یک پیام می‌بیند.

net-tcp-guide-commands.salam
واردسازی شبکه.تی سی پی
واردسازی رشته

ناپایا سرور := تی سی پی.سرور {}

تابع پاسخ(خط: رشته): رشته:
    واژه‌ها := خط.بشکاف(" ")
    فرمان := واژه‌ها.بگیر(۰)
    اگر فرمان == "جمع" و واژه‌ها.طول() == ۳:
        برگشت رشته.از عدد(واژه‌ها.بگیر(۱).به صحیح() + واژه‌ها.بگیر(۲).به صحیح())
    پایان
    اگر فرمان == "طول" و واژه‌ها.طول() == ۲:
        برگشت رشته.از عدد(واژه‌ها.بگیر(۱).شمارنویسه())
    پایان
    برگشت "خطا: فرمان ناشناخته: " + فرمان
پایان

تابع خدمت():
    ا := تی سی پی.پذیرش(سرور)
    تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
    ناپایا شمار := ۰
    تا درست:
        درخواست := تی سی پی.خواندن(ا، ۱۰۲۴)
        اگر درخواست == "":
            بشکن
        پایان
        _ := تی سی پی.نوشتن(ا، پاسخ(درخواست))
        شمار += ۱
    پایان
    تی سی پی.بستن(ا)
    سرچاپ "سرور: به"، شمار، "درخواست پاسخ داد"
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    ن := نخ‌ساز(خدمت)
    ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
    تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
    هر درخواست در ["جمع ۲ ۴۰"، "طول سلام"، "پینگ"]:
        _ := تی سی پی.نوشتن(ا، درخواست)
        سرچاپ درخواست، "->"، تی سی پی.خواندن(ا، ۱۰۲۴)
    پایان
    تی سی پی.بستن(ا)
    نخ‌پیوند(ن)
    تی سی پی.بستن سرور(سرور)
پایان
خروجیجمع ۲ ۴۰ -> 42 طول سلام -> 4 پینگ -> خطا: فرمان ناشناخته: پینگ سرور: به 3 درخواست پاسخ داد

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

خدمت به چند کارخواه با نخ‌های کارگر

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

net-tcp-guide-workers.salam
واردسازی شبکه.تی سی پی
واردسازی کانال
واردسازی رشته

ناپایا سرور := تی سی پی.سرور {}
ناپایا کارها := کانال.کانال {} برگردان کانال.کانال<صحیح۶۴>

تابع پذیرنده():
    تکرار ۳:
        ا := تی سی پی.پذیرش(سرور)
        اگر تی سی پی.اتصال معتبر(ا): _ := کارها.فرستادن(ا.توصیفگر) پایان
    پایان
    کارها.بستن()
پایان

تابع کارگر():
    ناپایا باز := درست
    تا درست:
        توصیف‌گر := کارها.دریافت(باز)
        اگر وارونه باز: بشکن پایان
        ا := تی سی پی.اتصال از توصیف‌گر(توصیف‌گر)
        تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
        درخواست := تی سی پی.خواندن(ا، ۱۰۲۴)
        _ := تی سی پی.نوشتن(ا، "سلام " + رشته.بزرگ(درخواست))
        تی سی پی.بستن(ا)
    پایان
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    کارها.مقداردهی(۸)
    پ := نخ‌ساز(پذیرنده)
    ک۱ := نخ‌ساز(کارگر)
    ک۲ := نخ‌ساز(کارگر)

    نام‌ها := ["sara"، "reza"، "mina"]
    ناپایا اتصال‌ها := وکتور {} برگردان وکتور<تی سی پی.اتصال شبکه>
    تکرار نام‌ها.طول():
        ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
        تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
        اتصال‌ها.بیفزا(ا)
    پایان
    هر ش، ا در اتصال‌ها:
        _ := تی سی پی.نوشتن(ا، نام‌ها[ش])
    پایان
    هر ش، ا در اتصال‌ها:
        سرچاپ نام‌ها[ش]، "->"، تی سی پی.خواندن(ا، ۱۰۲۴)
        تی سی پی.بستن(ا)
    پایان
    نخ‌پیوند(پ)
    نخ‌پیوند(ک۱)
    نخ‌پیوند(ک۲)
    تی سی پی.بستن سرور(سرور)
پایان
خروجیsara -> سلام SARA reza -> سلام REZA mina -> سلام MINA

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

پیام‌ها در جریان بایت

TCP بایت جابه‌جا می‌کند، نه پیام. دو نوشتن ممکن است در یک خواندن برسند و یک نوشتن ممکن است در چند خواندن تکه‌تکه برسد. نوبت‌گیریِ بخش قبل این را پنهان می‌کند، ولی همین که طرف مقابل چند پیام پشت سر هم بفرستد به قاب‌بندی نیاز دارید: یک جداکننده مثل خط تازه، یا طول هر پیام در ابتدایش. برنامه‌ی زیر چهار خط را در سه نوشتنِ نامساوی می‌فرستد و با نگه داشتن بخش ناتمامِ آخرین خواندن در مانده، آن‌ها را دوباره سر هم می‌کند.

net-tcp-guide-framing.salam
واردسازی شبکه.تی سی پی

ناپایا سرور := تی سی پی.سرور {}

تابع فرستنده():
    ا := تی سی پی.پذیرش(سرور)
    _ := تی سی پی.نوشتن(ا، "سیب\nموز")
    _ := تی سی پی.نوشتن(ا، "\nگیلاس\nخر")
    _ := تی سی پی.نوشتن(ا، "ما\n")
    تی سی پی.بستن(ا)
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    ن := نخ‌ساز(فرستنده)
    ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
    تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
    ناپایا مانده := ""
    ناپایا شمار := ۰
    تا درست:
        تکه := تی سی پی.خواندن(ا، ۴۰۹۶)
        اگر تکه == "":
            بشکن
        پایان
        مانده = مانده + تکه
        ناپایا جا := مانده.بیاب("\n")
        تا جا >= ۰:
            شمار += ۱
            سرچاپ شمار، مانده.زیررشته(۰، جا)
            مانده = مانده.زیررشته(جا + ۱، مانده.طول() - جا - ۱)
            جا = مانده.بیاب("\n")
        پایان
    پایان
    سرچاپ "باقی مانده:"، مانده.طول()، "بایت"
    تی سی پی.بستن(ا)
    نخ‌پیوند(ن)
    تی سی پی.بستن سرور(سرور)
پایان
خروجی1 سیب 2 موز 3 گیلاس 4 خرما باقی مانده: 0 بایت

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

مهلت‌ها و اتصال‌های ناموفق

بدون مهلت، خواندن برای طرفی که هیچ‌وقت پاسخ نمی‌دهد تا ابد صبر می‌کند. تنظیم مهلت خواندن بیشترین زمان انتظارِ یک خواندن را تعیین می‌کند، تنظیم مهلت نوشتن همین کار را برای نوشتن می‌کند و تنظیم مهلت هر دو را با هم. وقتی زمان تمام شود خواندن رشته‌ی خالی برمی‌گرداند، درست مثل اتصال بسته‌شده، پس هر دو را پایان گفتگو بدانید. اگر روی درگاه کسی گوش ندهد، شماره گیری برنامه را متوقف نمی‌کند: اتصالی برمی‌گرداند که اتصال معتبر برایش نادرست است.

net-tcp-guide-timeouts.salam
واردسازی شبکه.تی سی پی

تابع ریشه:
    خاموش := تی سی پی.پیوند(۰)
    ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(خاموش))
    سرچاپ "وصل شد:"، تی سی پی.اتصال معتبر(ا)
    تی سی پی.تنظیم مهلت خواندن(ا، ۳۰۰)
    پاسخ := تی سی پی.خواندن(ا، ۱۰۲۴)
    اگر پاسخ == "":
        سرچاپ "در ۳۰۰ میلی‌ثانیه پاسخی نیامد، دست می‌کشیم"
    پایان
    تی سی پی.بستن(ا)
    تی سی پی.بستن سرور(خاموش)

    ردشده := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(خاموش))
    اگر وارونه تی سی پی.اتصال معتبر(ردشده):
        سرچاپ "دیگر کسی روی آن درگاه گوش نمی‌دهد"
    پایان
پایان
خروجیوصل شد: true در ۳۰۰ میلی‌ثانیه پاسخی نیامد، دست می‌کشیم دیگر کسی روی آن درگاه گوش نمی‌دهد

یک سرور HTTP کوچک

HTTP/1.1 متنی است که روی TCP جابه‌جا می‌شود، پس برای یک صفحه‌ی وضعیت یا بررسی سلامت چند خط کافی است. درخواست با خطی مثل GET /hello HTTP/1.1 شروع می‌شود؛ نوشتن اچ تی تی پی خط وضعیت، Content-Type، Content-Length و Connection: close را برایتان می‌نویسد. سمت کارخواه نیمه‌ی دیگر را نشان می‌دهد: تا بسته شدن اتصال از سوی سرور می‌خواند و سرآیند را در اولین خط خالی از بدنه جدا می‌کند.

net-tcp-guide-http.salam
واردسازی شبکه.تی سی پی

ناپایا سرور := تی سی پی.سرور {}

تابع رسیدگی():
    ا := تی سی پی.پذیرش(سرور)
    تی سی پی.تنظیم مهلت(ا، ۲۰۰۰)
    درخواست := تی سی پی.خواندن(ا، ۴۰۹۶)
    خط اول := درخواست.بشکاف("\r\n").بگیر(۰)
    مسیر := خط اول.بشکاف(" ").بگیر(۱)
    اگر مسیر == "/hello":
        تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "text/plain; charset=utf-8"، "سلام از سلام")
    وگرنه:
        تی سی پی.نوشتن اچ تی تی پی(ا، "404 Not Found"، "text/plain; charset=utf-8"، "صفحه‌ای در " + مسیر + " نیست")
    پایان
    تی سی پی.بستن(ا)
پایان

تابع بگیر صفحه(مسیر: رشته):
    ن := نخ‌ساز(رسیدگی)
    ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
    تی سی پی.تنظیم مهلت(ا، ۲۰۰۰)
    _ := تی سی پی.نوشتن(ا، "GET " + مسیر + " HTTP/1.1\r\nHost: localhost\r\n\r\n")
    ناپایا پاسخ := ""
    تا درست:
        تکه := تی سی پی.خواندن(ا، ۴۰۹۶)
        اگر تکه == "":
            بشکن
        پایان
        پاسخ = پاسخ + تکه
    پایان
    تی سی پی.بستن(ا)
    نخ‌پیوند(ن)
    مرز := پاسخ.بیاب("\r\n\r\n")
    سرچاپ پاسخ.بشکاف("\r\n").بگیر(۰)
    سرچاپ "  بدنه:"، پاسخ.زیررشته(مرز + ۴، پاسخ.طول() - مرز - ۴)
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    بگیر صفحه("/hello")
    بگیر صفحه("/missing")
    تی سی پی.بستن سرور(سرور)
پایان
خروجیHTTP/1.1 200 OK بدنه: سلام از سلام HTTP/1.1 404 Not Found بدنه: صفحه‌ای در /missing نیست

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

اتصال رمزگذاری‌شده

شماره گیری امن در یک فراخوانی وصل می‌شود، دست‌دهی TLS را انجام می‌دهد و یک اتصال تی ال اس برمی‌گرداند. از آن به بعد با تابع‌های بسته‌ی تی ال اس بخوانید و بنویسید، نه با خواندن همین بسته، چون بایت‌های روی سوکت رمز شده‌اند. این نمونه به اینترنت نیاز دارد؛ نسخه‌ی TLS و خط اول پاسخ را چاپ می‌کند که برای example.com برابر HTTP/1.1 200 OK است.

net-tcp-guide-https.salam
واردسازی شبکه.تی سی پی
واردسازی تی ال اس

تابع ریشه:
    ناپایا ا := تی سی پی.شماره گیری امن("example.com"، ۴۴۳)
    اگر وارونه تی ال اس.اتصال معتبر(ا):
        سرچاپ "TLS شکست خورد:"، تی ال اس.خطای اتصال(ا)
        برگشت ۱
    پایان
    سرچاپ "پروتکل:"، تی ال اس.نسخه(ا)
    _ := تی ال اس.نوشتن(ا، "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")
    سرآیند := تی ال اس.خواندن(ا، ۴۰۹۶)
    سرچاپ سرآیند.بشکاف("\r\n").بگیر(۰)
    تی ال اس.بستن اتصال(ا)
    برگشت ۰
پایان

پروتکل‌هایی مثل SMTP و IMAP با متن ساده شروع می‌کنند و بعد با فرمان STARTTLS به TLS می‌روند. برای آن‌ها اول شماره گیری کنید، تا موافقت سرور گفتگو کنید و سپس ارتقا به تی ال اس را روی همان اتصال صدا بزنید.

کدام تابع برای کدام کار

کارتابع
گوش دادن برای کارخواه‌هاپیوند و سپس پذیرش در حلقه؛ درگاه وقتی درگاه ۰ را داده‌اید
وصل شدن به سرورشماره گیری و سپس بررسی اتصال معتبر
فرستادن و گرفتن متننوشتن و خواندن
فرستادن و گرفتن داده‌ی دودویینوشتن بایت و خواندن بایت
گیر نکردن پشت طرفی که ساکت استتنظیم مهلت خواندن، تنظیم مهلت نوشتن یا تنظیم مهلت
ترافیک تعاملی با بسته‌های کوچکغیرفعال‌سازی نگل
فهمیدن قطع شدنِ اتصال‌های بیکارتنظیم زنده‌نگه‌داری
HTTPS و دیگر پروتکل‌های TLSشماره گیری امن، یا ارتقا به تی ال اس برای STARTTLS
استفاده‌ی دوباره از اتصال‌ها به یک میزباناستخر جدید، دریافت اتصال و بازگرداندن اتصال

گونه‌ها

سرور Server

ساختار سرور
سرور TCP که روی یک درگاه گوش می‌دهد.
نامانگلیسیگونهتوضیح
توصیفگرfdصحیح۶۴ = -1شناسه‌ی سوکت؛ ‎-1 یعنی نامعتبر.
درگاهportصحیح = 0درگاهی که سرور روی آن گوش می‌دهد.
net-tcp-Echo.salam
واردسازی شبکه.تی سی پی

ناپایا سرور := تی سی پی.سرور {}

تابع پاسخ‌گو():
    ا := تی سی پی.پذیرش(سرور)
    پیام := تی سی پی.خواندن(ا، ۱۰۲۴)
    _ := تی سی پی.نوشتن(ا، "پژواک: " + پیام)
    تی سی پی.بستن(ا)
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    سرچاپ تی سی پی.معتبر(سرور)، تی سی پی.درگاه(سرور) > ۰
    ن := نخ‌ساز(پاسخ‌گو)
    ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
    سرچاپ تی سی پی.اتصال معتبر(ا)
    تی سی پی.تنظیم مهلت(ا، ۲۰۰۰)
    تی سی پی.تنظیم زنده‌نگه‌داری(ا، درست)
    تی سی پی.غیرفعال‌سازی نگل(ا، درست)
    سرچاپ تی سی پی.نوشتن(ا، "سلام")
    سرچاپ تی سی پی.خواندن(ا، ۱۰۲۴)
    تی سی پی.بستن(ا)
    نخ‌پیوند(ن)
    تی سی پی.بستن سرور(سرور)
    سرچاپ تی سی پی.اتصال معتبر(تی سی پی.شماره گیری("127.0.0.1"، ۱))
پایان
خروجیtrue true true 8 پژواک: سلام false

اتصال شبکه Conn

ساختار اتصال شبکه
یک اتصال TCP.
نامانگلیسیگونهتوضیح
توصیفگرfdصحیح۶۴ = -1شناسه‌ی سوکت؛ ‎-1 یعنی نامعتبر.

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

مدخل استخر PoolEntry

ساختار مدخل استخر
یک اتصال بی‌کار در استخر.
نامانگلیسیگونهتوضیح
کلیدkeyرشته = ""میزبان و درگاه.
اتصالconnاتصال شبکهاتصال.
زمان بازگشت میلی‌ثانیهput_at_msصحیح۶۴ = 0زمان برگرداندن به استخر.
net-tcp-Pool.salam
واردسازی شبکه.تی سی پی

تابع ریشه:
    س := تی سی پی.پیوند(۰)
    درگاه := تی سی پی.درگاه(س)
    ناپایا استخر := تی سی پی.استخر جدید()
    ا := تی سی پی.دریافت اتصال(استخر، "127.0.0.1"، درگاه، ۱۰۰۰)
    سرچاپ تی سی پی.اتصال معتبر(ا)، تی سی پی.تعداد استخر(استخر)
    تی سی پی.بازگرداندن اتصال(استخر، "127.0.0.1"، درگاه، ا، ۱۰۰۰)
    سرچاپ تی سی پی.تعداد استخر(استخر)
    دوباره := تی سی پی.دریافت اتصال(استخر، "127.0.0.1"، درگاه، ۲۰۰۰)
    سرچاپ دوباره.توصیفگر == ا.توصیفگر، تی سی پی.تعداد استخر(استخر)
    تی سی پی.بازگرداندن اتصال(استخر، "127.0.0.1"، درگاه، دوباره، ۲۰۰۰)
    تازه := تی سی پی.دریافت اتصال(استخر، "127.0.0.1"، درگاه، ۲۰۰۰ + استخر.بیشترین بی‌کاری میلی‌ثانیه + ۱)
    سرچاپ تی سی پی.اتصال معتبر(تازه)، تی سی پی.تعداد استخر(استخر)
    تی سی پی.بستن(تازه)
    تی سی پی.بستن سرور(س)
پایان
خروجیtrue 0 1 true 0 true 0

مدخل‌های استخر PoolEntries

ساختار مدخل‌های استخر
فهرست اتصال‌های بی‌کار.
نامانگلیسیگونهتوضیح
مدخل‌هاitemsوکتور<مدخل استخر>اتصال‌ها.

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

استخر اتصال Pool

ساختار استخر اتصال
استخر اتصال‌های بی‌کار برای استفاده‌ی دوباره.
نامانگلیسیگونهتوضیح
اتصال‌های بی‌کارentriesمدخل‌های استخراتصال‌های بی‌کار.
بیشترین بی‌کاری میلی‌ثانیهidle_ttl_msصحیح۶۴ = 30000بیشترین زمانی که اتصال بی‌کار نگه داشته می‌شود؛ پیش‌فرض ۳۰ ثانیه.

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

تابع‌ها

پیوند Bind

تابع پیوند(port: صحیح): سرور
روی درگاه داده‌شده و روی همه‌ی رابط‌های IPv4 گوش می‌دهد؛ درگاه صفر یعنی سیستم یک درگاه آزاد انتخاب کند. پس از آن معتبر را بررسی کنید: درگاهی که در حال استفاده است سروری نامعتبر می‌دهد.

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

معتبر Ok

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

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

درگاه Port

تابع درگاه(srv: سرور): صحیح
درگاه واقعی سرور؛ برای وقتی که صفر داده‌اید.

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

پذیرش Accept

تابع پذیرش(srv: سرور): اتصال شبکه
صبر می‌کند تا کارخواهی وصل شود و اتصالش را برمی‌گرداند.

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

بستن سرور CloseServer

تابع بستن سرور(srv: سرور)
سرور را می‌بندد.

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

اتصال معتبر ConnOk

تابع اتصال معتبر(c: اتصال شبکه): منطقی
اگر اتصال برقرار باشد، درست برمی‌گرداند.

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

خواندن Read

تابع خواندن(c: اتصال شبکه، max: صحیح): رشته
حداکثر max بایت (۴۰۹۶ اگر max صفر یا کمتر باشد) را به شکل متن می‌خواند؛ اگر طرف دیگر اتصال را بسته باشد، مهلت گذشته باشد یا خطایی رخ دهد، رشته‌ی خالی. متن در نخستین بایت صفر تمام می‌شود.

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

نوشتن Write

تابع نوشتن(c: اتصال شبکه، data: رشته): صحیح
متن را با یک فراخوانی سیستمی می‌فرستد و تعداد بایت‌های فرستاده‌شده را برمی‌گرداند که برای داده‌ی بزرگ ممکن است از طول کمتر باشد، یا در خطا ‎-1.

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

خواندن بایت ReadBytes

تابع خواندن بایت(c: اتصال شبکه، buf: تهی*، max: صحیح): صحیح
حداکثر max بایت را در حافظه می‌خواند و تعداد را برمی‌گرداند؛ صفر یا کمتر یعنی پایان یا خطا.
net-tcp-Bytes.salam
واردسازی شبکه.تی سی پی
واردسازی حافظه

ناپایا سرور := تی سی پی.سرور {}

تابع پاسخ‌گو():
    ا := تی سی پی.پذیرش(سرور)
    تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
    تی سی پی.تنظیم مهلت نوشتن(ا، ۲۰۰۰)
    _ := تی سی پی.خواندن(ا، ۱۰۲۴)
    تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "text/plain"، "سلام")
    تی سی پی.بستن(ا)
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    ن := نخ‌ساز(پاسخ‌گو)
    ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
    درخواست := "GET / HTTP/1.0\r\n\r\n"
    سرچاپ تی سی پی.نوشتن بایت(ا، درخواست برگردان تهی*، درخواست.طول())
    ب := حافظه.تخصیص صفرشده(۲۵۶ برگردان طبیعی۶۴)
    ناپایا جمع := ۰
    تا درست:
        ر := تی سی پی.خواندن بایت(ا، ب، ۲۵۵)
        اگر ر <= ۰:
            بشکن
        پایان
        جمع += ر
    پایان
    سرچاپ جمع > ۰
    دوباره := تی سی پی.اتصال از توصیف‌گر(ا.توصیفگر)
    سرچاپ دوباره.توصیفگر == ا.توصیفگر
    تی سی پی.بستن(ا)
    نخ‌پیوند(ن)
    تی سی پی.بستن سرور(سرور)
    حافظه.آزادسازی(ب)
پایان
خروجی18 true true

نوشتن بایت WriteBytes

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

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

بستن Close

تابع بستن(c: اتصال شبکه)
اتصال را می‌بندد.

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

شماره گیری Dial

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

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

شماره گیری با مهلت DialTimeout

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

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

شماره گیری امن DialTLS

تابع شماره گیری امن(host: رشته، port: صحیح): tls.اتصال شبکه
اتصال رمزشده‌ی TLS برقرار می‌کند؛ برای HTTPS و مانند آن.
net-tcp-TLS.salam
واردسازی شبکه.تی سی پی
واردسازی تی ال اس

تابع ریشه:
    _ := تی سی پی.شماره گیری امن("example.com"، ۴۴۳)
    ساده := تی سی پی.شماره گیری("example.com"، ۴۴۳)
    _ := تی سی پی.ارتقا به تی ال اس(ساده، تی ال اس.پیکربندی جدید("example.com"))
پایان

ارتقا به تی ال اس UpgradeTLS

تابع ارتقا به تی ال اس(c: اتصال شبکه، cfg: tls.Config): tls.اتصال شبکه
اتصال ساده‌ی موجود را با پیکربندی داده‌شده به TLS ارتقا می‌دهد؛ مثل STARTTLS.

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

اتصال از توصیف‌گر ConnFromFd

تابع اتصال از توصیف‌گر(fd: صحیح۶۴): اتصال شبکه
اتصال را از شناسه‌ی یک سوکت می‌سازد، مثلاً conn.fdی که از راه کانال به نخی دیگر رسیده است.

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

نوشتن اچ تی تی پی WriteHTTP

تابع نوشتن اچ تی تی پی(c: اتصال شبکه، status_line: رشته، content_type: رشته، body: رشته)
پاسخ کامل HTTP/1.1 با خط وضعیت، نوع محتوا، Content-Length و Connection: close می‌فرستد؛ برای سرورهای خیلی ساده.

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

تنظیم مهلت خواندن SetReadDeadline

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

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

تنظیم مهلت نوشتن SetWriteDeadline

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

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

تنظیم مهلت SetDeadline

تابع تنظیم مهلت(c: اتصال شبکه، millis: صحیح)
مهلت خواندن و نوشتن را با هم تنظیم می‌کند.

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

تنظیم زنده‌نگه‌داری SetKeepAlive

تابع تنظیم زنده‌نگه‌داری(c: اتصال شبکه، enable: منطقی)
بسته‌های زنده‌نگه‌داری TCP را روشن یا خاموش می‌کند تا اتصال بی‌کار قطع‌شده شناخته شود.

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

غیرفعال‌سازی نگل SetNoDelay

تابع غیرفعال‌سازی نگل(c: اتصال شبکه، enable: منطقی)
الگوریتم نیگل را خاموش می‌کند تا بسته‌های کوچک بی‌درنگ فرستاده شوند؛ برای برنامه‌های تعاملی.

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

استخر جدید NewPool

تابع استخر جدید(): استخر اتصال
استخر خالی.

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

دریافت اتصال Get

تابع دریافت اتصال(p &: استخر اتصال، host: رشته، port: صحیح، now_ms: صحیح۶۴): اتصال شبکه
اگر اتصال بی‌کار تازه‌ای به این میزبان در استخر باشد، همان را برمی‌گرداند؛ وگرنه اتصال تازه‌ای می‌سازد. now_ms زمان فعلی است.

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

بازگرداندن اتصال Put

تابع بازگرداندن اتصال(p &: استخر اتصال، host: رشته، port: صحیح، c: اتصال شبکه، now_ms: صحیح۶۴)
اتصال را پس از کار به استخر برمی‌گرداند.

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

تعداد استخر PoolLen

تابع تعداد استخر(p: استخر اتصال): صحیح
تعداد اتصال‌های بی‌کار در استخر.

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