تی سی پی net/tcp
سرور و کارخواه TCP: گوش دادن، وصل شدن، خواندن و نوشتن، TLS و استخر اتصال.
واردسازی شبکه.تی سی پی
TCP پایهی بیشتر پروتکلهای اینترنت است: یک جریان مطمئن و مرتب از بایتها میان دو برنامه. سرور با پیوند روی یک درگاه گوش میدهد و با پذیرش هر کارخواه تازه را میگیرد؛ کارخواه با شماره گیری وصل میشود.
پذیرش و خواندن تا رسیدن چیزی صبر میکنند، پس سروری که با چند کارخواه حرف میزند هر اتصال را به یک نخ میسپارد، همانطور که راهنمای کارگرها نشان میدهد. همهی نمونهها روی 127.0.0.1 اجرا میشوند و شبکه لازم ندارند.
این بسته را برای پروتکلهای خودتان و برای گفتوگو با سرورهایی به کار ببرید که کارخواهی در کتابخانهی استاندارد ندارند. برای HTTP بستهی اچ تی تی پی، برای پیامهایی که نباید شکسته یا مرتب شوند یو دی پی و برای ترافیک دوطرفهی زنده با مرورگرها وبسوکت را ببینید. تی ال اس روی اتصالی از همین بسته رمزنگاری میافزاید.
اشتباههای رایج
خواندنخالی سه معنا دارد. طرف مقابل اتصال را بسته، مهلت خواندن گذشته یا خطایی رخ داده است؛ هر سه""برمیگردانند. پیامی که با بایت صفر شروع شود هم خالی برمیگردد و متن پس از بایت صفر از دست میرود، پس برای دادهی دودوییخواندن بایترا به کار ببرید.نوشتنممکن است فقط بخشی از متن را بفرستد. یک فراخوانی سیستمی انجام میدهد و تعداد بایتهای فرستادهشده را برمیگرداند. برای دادهی بزرگ نتیجه را با طول مقایسه کنید، یانوشتن بایترا به کار ببرید که تا فرستادن همه چیز تکرار میکند.- پیامها از هم جدا نمیمانند. TCP جریانی از بایتهاست؛ پیامهایتان را با یک جداکننده یا طول قاببندی کنید، همانطور که راهنمای قاببندی میکند.
پیوندروی همهی رابطهای IPv4 گوش میدهد، نه فقط روی127.0.0.1، پس سرور آزمایشی از شبکه هم در دسترس است مگر دیوارهی آتش جلویش را بگیرد. کارخواههای IPv6 به آن نمیرسند؛ خودشماره گیریهمهی نشانیهایی را که یک نام به آنها میرسد، از جمله IPv6، امتحان میکند.- شکست برنامه را متوقف نمیکند.
پیوند،پذیرشوشماره گیریمقداری با fd برابر -1 برمیگردانند؛معتبریااتصال معتبررا بررسی کنید.
پروتکل پرسش و پاسخ
بیشتر پروتکلهای کوچک نوبتی کار میکنند: کارخواه یک درخواست میفرستد، سرور یک پاسخ میدهد و این رفت و برگشت تا وقتی کارخواه اتصال را ببندد ادامه دارد. سرورِ نمونهی زیر در یک حلقه میخواند و وقتی خواندن رشتهی خالی برگرداند میایستد؛ TCP بسته شدن اتصال از سوی دیگر را همینطور خبر میدهد. کارخواه پیش از فرستادن درخواست بعدی منتظر پاسخ میماند، پس هر خواندن درست یک پیام میبیند.
واردسازی شبکه.تی سی پی
واردسازی رشته
ناپایا سرور := تی سی پی.سرور {}
تابع پاسخ(خط: رشته): رشته:
واژهها := خط.بشکاف(" ")
فرمان := واژهها.بگیر(۰)
اگر فرمان == "جمع" و واژهها.طول() == ۳:
برگشت رشته.از عدد(واژهها.بگیر(۱).به صحیح() + واژهها.بگیر(۲).به صحیح())
پایان
اگر فرمان == "طول" و واژهها.طول() == ۲:
برگشت رشته.از عدد(واژهها.بگیر(۱).شمارنویسه())
پایان
برگشت "خطا: فرمان ناشناخته: " + فرمان
پایان
تابع خدمت():
ا := تی سی پی.پذیرش(سرور)
تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
ناپایا شمار := ۰
تا درست:
درخواست := تی سی پی.خواندن(ا، ۱۰۲۴)
اگر درخواست == "":
بشکن
پایان
_ := تی سی پی.نوشتن(ا، پاسخ(درخواست))
شمار += ۱
پایان
تی سی پی.بستن(ا)
سرچاپ "سرور: به"، شمار، "درخواست پاسخ داد"
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
ن := نخساز(خدمت)
ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
هر درخواست در ["جمع ۲ ۴۰"، "طول سلام"، "پینگ"]:
_ := تی سی پی.نوشتن(ا، درخواست)
سرچاپ درخواست، "->"، تی سی پی.خواندن(ا، ۱۰۲۴)
پایان
تی سی پی.بستن(ا)
نخپیوند(ن)
تی سی پی.بستن سرور(سرور)
پایانسرور با نخساز در نخ خودش اجرا میشود و برنامهی اصلی با نخپیوند منتظر پایانش میماند. یک سرور واقعی پذیرش را در حلقه صدا میزند و هر اتصال را به یک کارگر میسپارد؛ تا یک کارخواه در حال خدمت گرفتن است، بقیه در صف سوکتِ شنونده منتظر میمانند.
خدمت به چند کارخواه با نخهای کارگر
سروری که هر بار فقط از یک کارخواه میخواند، همه را پشت یک کارخواه کند معطل میکند. شکل رایج این است: یک نخ که فقط میپذیرد، یک کانال که اتصالهای تازه را میبرد و چند نخ کارگر که به آنها خدمت میکنند. نخ اتصال را به شکل شمارهی سوکتش، ا.fd، میگیرد و با اتصال از توصیفگر دوباره آن را به اتصال تبدیل میکند.
واردسازی شبکه.تی سی پی
واردسازی کانال
واردسازی رشته
ناپایا سرور := تی سی پی.سرور {}
ناپایا کارها := کانال.کانال {} برگردان کانال.کانال<صحیح۶۴>
تابع پذیرنده():
تکرار ۳:
ا := تی سی پی.پذیرش(سرور)
اگر تی سی پی.اتصال معتبر(ا): _ := کارها.فرستادن(ا.توصیفگر) پایان
پایان
کارها.بستن()
پایان
تابع کارگر():
ناپایا باز := درست
تا درست:
توصیفگر := کارها.دریافت(باز)
اگر وارونه باز: بشکن پایان
ا := تی سی پی.اتصال از توصیفگر(توصیفگر)
تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
درخواست := تی سی پی.خواندن(ا، ۱۰۲۴)
_ := تی سی پی.نوشتن(ا، "سلام " + رشته.بزرگ(درخواست))
تی سی پی.بستن(ا)
پایان
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
کارها.مقداردهی(۸)
پ := نخساز(پذیرنده)
ک۱ := نخساز(کارگر)
ک۲ := نخساز(کارگر)
نامها := ["sara"، "reza"، "mina"]
ناپایا اتصالها := وکتور {} برگردان وکتور<تی سی پی.اتصال شبکه>
تکرار نامها.طول():
ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
اتصالها.بیفزا(ا)
پایان
هر ش، ا در اتصالها:
_ := تی سی پی.نوشتن(ا، نامها[ش])
پایان
هر ش، ا در اتصالها:
سرچاپ نامها[ش]، "->"، تی سی پی.خواندن(ا، ۱۰۲۴)
تی سی پی.بستن(ا)
پایان
نخپیوند(پ)
نخپیوند(ک۱)
نخپیوند(ک۲)
تی سی پی.بستن سرور(سرور)
پایانهر سه کارخواه پیش از فرستادن هر کلمهای وصل میشوند و فقط دو کارگر وجود دارد، پس اتصال سوم در کانال منتظر میماند تا کارگری آزاد شود؛ با این حال پاسخ میگیرد. بستن کانال پس از آخرین پذیرش باعث میشود دریافت مقدار باز را نادرست کند، که حلقهی کارگرها را تمام میکند و نخپیوند برمیگردد. در سروری که مدتها کار میکند، پذیرنده تا ابد تکرار میکند و تعداد کارگرها سقف کارخواههایی را که همزمان خدمت میگیرند تعیین میکند.
پیامها در جریان بایت
TCP بایت جابهجا میکند، نه پیام. دو نوشتن ممکن است در یک خواندن برسند و یک نوشتن ممکن است در چند خواندن تکهتکه برسد. نوبتگیریِ بخش قبل این را پنهان میکند، ولی همین که طرف مقابل چند پیام پشت سر هم بفرستد به قاببندی نیاز دارید: یک جداکننده مثل خط تازه، یا طول هر پیام در ابتدایش. برنامهی زیر چهار خط را در سه نوشتنِ نامساوی میفرستد و با نگه داشتن بخش ناتمامِ آخرین خواندن در مانده، آنها را دوباره سر هم میکند.
واردسازی شبکه.تی سی پی
ناپایا سرور := تی سی پی.سرور {}
تابع فرستنده():
ا := تی سی پی.پذیرش(سرور)
_ := تی سی پی.نوشتن(ا، "سیب\nموز")
_ := تی سی پی.نوشتن(ا، "\nگیلاس\nخر")
_ := تی سی پی.نوشتن(ا، "ما\n")
تی سی پی.بستن(ا)
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
ن := نخساز(فرستنده)
ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
ناپایا مانده := ""
ناپایا شمار := ۰
تا درست:
تکه := تی سی پی.خواندن(ا، ۴۰۹۶)
اگر تکه == "":
بشکن
پایان
مانده = مانده + تکه
ناپایا جا := مانده.بیاب("\n")
تا جا >= ۰:
شمار += ۱
سرچاپ شمار، مانده.زیررشته(۰، جا)
مانده = مانده.زیررشته(جا + ۱، مانده.طول() - جا - ۱)
جا = مانده.بیاب("\n")
پایان
پایان
سرچاپ "باقی مانده:"، مانده.طول()، "بایت"
تی سی پی.بستن(ا)
نخپیوند(ن)
تی سی پی.بستن سرور(سرور)
پایانبرای دادهی دودویی یک سرآیند با اندازهی ثابت بفرستید که طول پیام در آن است و آنقدر بخوانید تا همان تعداد بایت برسد. خواندن بایت و نوشتن بایت برای این کار مستقیم با حافظه کار میکنند و برخلاف رشته در اولین بایت صفر نمیایستند.
مهلتها و اتصالهای ناموفق
بدون مهلت، خواندن برای طرفی که هیچوقت پاسخ نمیدهد تا ابد صبر میکند. تنظیم مهلت خواندن بیشترین زمان انتظارِ یک خواندن را تعیین میکند، تنظیم مهلت نوشتن همین کار را برای نوشتن میکند و تنظیم مهلت هر دو را با هم. وقتی زمان تمام شود خواندن رشتهی خالی برمیگرداند، درست مثل اتصال بستهشده، پس هر دو را پایان گفتگو بدانید. اگر روی درگاه کسی گوش ندهد، شماره گیری برنامه را متوقف نمیکند: اتصالی برمیگرداند که اتصال معتبر برایش نادرست است.
واردسازی شبکه.تی سی پی
تابع ریشه:
خاموش := تی سی پی.پیوند(۰)
ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(خاموش))
سرچاپ "وصل شد:"، تی سی پی.اتصال معتبر(ا)
تی سی پی.تنظیم مهلت خواندن(ا، ۳۰۰)
پاسخ := تی سی پی.خواندن(ا، ۱۰۲۴)
اگر پاسخ == "":
سرچاپ "در ۳۰۰ میلیثانیه پاسخی نیامد، دست میکشیم"
پایان
تی سی پی.بستن(ا)
تی سی پی.بستن سرور(خاموش)
ردشده := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(خاموش))
اگر وارونه تی سی پی.اتصال معتبر(ردشده):
سرچاپ "دیگر کسی روی آن درگاه گوش نمیدهد"
پایان
پایانیک سرور HTTP کوچک
HTTP/1.1 متنی است که روی TCP جابهجا میشود، پس برای یک صفحهی وضعیت یا بررسی سلامت چند خط کافی است. درخواست با خطی مثل GET /hello HTTP/1.1 شروع میشود؛ نوشتن اچ تی تی پی خط وضعیت، Content-Type، Content-Length و Connection: close را برایتان مینویسد. سمت کارخواه نیمهی دیگر را نشان میدهد: تا بسته شدن اتصال از سوی سرور میخواند و سرآیند را در اولین خط خالی از بدنه جدا میکند.
واردسازی شبکه.تی سی پی
ناپایا سرور := تی سی پی.سرور {}
تابع رسیدگی():
ا := تی سی پی.پذیرش(سرور)
تی سی پی.تنظیم مهلت(ا، ۲۰۰۰)
درخواست := تی سی پی.خواندن(ا، ۴۰۹۶)
خط اول := درخواست.بشکاف("\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")
تی سی پی.بستن سرور(سرور)
پایاناین برای یک نشانی اشکالزدایی خوب است. برای یک سرویس وب واقعی از اچ تی تی پی استفاده کنید که اتصال ماندگار، بدنهی تکهای، سرآیندها و مسیریابی را اداره میکند.
اتصال رمزگذاریشده
شماره گیری امن در یک فراخوانی وصل میشود، دستدهی TLS را انجام میدهد و یک اتصال تی ال اس برمیگرداند. از آن به بعد با تابعهای بستهی تی ال اس بخوانید و بنویسید، نه با خواندن همین بسته، چون بایتهای روی سوکت رمز شدهاند. این نمونه به اینترنت نیاز دارد؛ نسخهی TLS و خط اول پاسخ را چاپ میکند که برای example.com برابر HTTP/1.1 200 OK است.
واردسازی شبکه.تی سی پی
واردسازی تی ال اس
تابع ریشه:
ناپایا ا := تی سی پی.شماره گیری امن("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
ساختار سرور| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| توصیفگر | fd | صحیح۶۴ = -1 | شناسهی سوکت؛ -1 یعنی نامعتبر. |
| درگاه | port | صحیح = 0 | درگاهی که سرور روی آن گوش میدهد. |
واردسازی شبکه.تی سی پی
ناپایا سرور := تی سی پی.سرور {}
تابع پاسخگو():
ا := تی سی پی.پذیرش(سرور)
پیام := تی سی پی.خواندن(ا، ۱۰۲۴)
_ := تی سی پی.نوشتن(ا، "پژواک: " + پیام)
تی سی پی.بستن(ا)
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
سرچاپ تی سی پی.معتبر(سرور)، تی سی پی.درگاه(سرور) > ۰
ن := نخساز(پاسخگو)
ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
سرچاپ تی سی پی.اتصال معتبر(ا)
تی سی پی.تنظیم مهلت(ا، ۲۰۰۰)
تی سی پی.تنظیم زندهنگهداری(ا، درست)
تی سی پی.غیرفعالسازی نگل(ا، درست)
سرچاپ تی سی پی.نوشتن(ا، "سلام")
سرچاپ تی سی پی.خواندن(ا، ۱۰۲۴)
تی سی پی.بستن(ا)
نخپیوند(ن)
تی سی پی.بستن سرور(سرور)
سرچاپ تی سی پی.اتصال معتبر(تی سی پی.شماره گیری("127.0.0.1"، ۱))
پایاناتصال شبکه Conn
ساختار اتصال شبکه| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| توصیفگر | fd | صحیح۶۴ = -1 | شناسهی سوکت؛ -1 یعنی نامعتبر. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tcp-Echo.salam
مدخل استخر PoolEntry
ساختار مدخل استخر| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| کلید | key | رشته = "" | میزبان و درگاه. |
| اتصال | conn | اتصال شبکه | اتصال. |
| زمان بازگشت میلیثانیه | put_at_ms | صحیح۶۴ = 0 | زمان برگرداندن به استخر. |
واردسازی شبکه.تی سی پی
تابع ریشه:
س := تی سی پی.پیوند(۰)
درگاه := تی سی پی.درگاه(س)
ناپایا استخر := تی سی پی.استخر جدید()
ا := تی سی پی.دریافت اتصال(استخر، "127.0.0.1"، درگاه، ۱۰۰۰)
سرچاپ تی سی پی.اتصال معتبر(ا)، تی سی پی.تعداد استخر(استخر)
تی سی پی.بازگرداندن اتصال(استخر، "127.0.0.1"، درگاه، ا، ۱۰۰۰)
سرچاپ تی سی پی.تعداد استخر(استخر)
دوباره := تی سی پی.دریافت اتصال(استخر، "127.0.0.1"، درگاه، ۲۰۰۰)
سرچاپ دوباره.توصیفگر == ا.توصیفگر، تی سی پی.تعداد استخر(استخر)
تی سی پی.بازگرداندن اتصال(استخر، "127.0.0.1"، درگاه، دوباره، ۲۰۰۰)
تازه := تی سی پی.دریافت اتصال(استخر، "127.0.0.1"، درگاه، ۲۰۰۰ + استخر.بیشترین بیکاری میلیثانیه + ۱)
سرچاپ تی سی پی.اتصال معتبر(تازه)، تی سی پی.تعداد استخر(استخر)
تی سی پی.بستن(تازه)
تی سی پی.بستن سرور(س)
پایانمدخلهای استخر PoolEntries
ساختار مدخلهای استخر| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| مدخلها | items | وکتور<مدخل استخر> | اتصالها. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tcp-Pool.salam
استخر اتصال Pool
ساختار استخر اتصال| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| اتصالهای بیکار | entries | مدخلهای استخر | اتصالهای بیکار. |
| بیشترین بیکاری میلیثانیه | idle_ttl_ms | صحیح۶۴ = 30000 | بیشترین زمانی که اتصال بیکار نگه داشته میشود؛ پیشفرض ۳۰ ثانیه. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tcp-Pool.salam
تابعها
پیوند Bind
تابع پیوند(port: صحیح): سرورمعتبر را بررسی کنید: درگاهی که در حال استفاده است سروری نامعتبر میدهد.نمونهی این مورد همراه با موارد بالاتر آمده است: 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: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tcp-Echo.salam
خواندن بایت ReadBytes
تابع خواندن بایت(c: اتصال شبکه، buf: تهی*، max: صحیح): صحیحmax بایت را در حافظه میخواند و تعداد را برمیگرداند؛ صفر یا کمتر یعنی پایان یا خطا.واردسازی شبکه.تی سی پی
واردسازی حافظه
ناپایا سرور := تی سی پی.سرور {}
تابع پاسخگو():
ا := تی سی پی.پذیرش(سرور)
تی سی پی.تنظیم مهلت خواندن(ا، ۲۰۰۰)
تی سی پی.تنظیم مهلت نوشتن(ا، ۲۰۰۰)
_ := تی سی پی.خواندن(ا، ۱۰۲۴)
تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "text/plain"، "سلام")
تی سی پی.بستن(ا)
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
ن := نخساز(پاسخگو)
ا := تی سی پی.شماره گیری("127.0.0.1"، تی سی پی.درگاه(سرور))
درخواست := "GET / HTTP/1.0\r\n\r\n"
سرچاپ تی سی پی.نوشتن بایت(ا، درخواست برگردان تهی*، درخواست.طول())
ب := حافظه.تخصیص صفرشده(۲۵۶ برگردان طبیعی۶۴)
ناپایا جمع := ۰
تا درست:
ر := تی سی پی.خواندن بایت(ا، ب، ۲۵۵)
اگر ر <= ۰:
بشکن
پایان
جمع += ر
پایان
سرچاپ جمع > ۰
دوباره := تی سی پی.اتصال از توصیفگر(ا.توصیفگر)
سرچاپ دوباره.توصیفگر == ا.توصیفگر
تی سی پی.بستن(ا)
نخپیوند(ن)
تی سی پی.بستن سرور(سرور)
حافظه.آزادسازی(ب)
پایاننوشتن بایت 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.اتصال شبکهواردسازی شبکه.تی سی پی
واردسازی تی ال اس
تابع ریشه:
_ := تی سی پی.شماره گیری امن("example.com"، ۴۴۳)
ساده := تی سی پی.شماره گیری("example.com"، ۴۴۳)
_ := تی سی پی.ارتقا به تی ال اس(ساده، تی ال اس.پیکربندی جدید("example.com"))
پایانارتقا به تی ال اس UpgradeTLS
تابع ارتقا به تی ال اس(c: اتصال شبکه، cfg: tls.Config): tls.اتصال شبکهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tcp-TLS.salam
اتصال از توصیفگر ConnFromFd
تابع اتصال از توصیفگر(fd: صحیح۶۴): اتصال شبکهconn.fdی که از راه کانال به نخی دیگر رسیده است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tcp-Bytes.salam
نوشتن اچ تی تی پی WriteHTTP
تابع نوشتن اچ تی تی پی(c: اتصال شبکه، status_line: رشته، content_type: رشته، body: رشته)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: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: 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