Translation

(itstool) path: imageobject/imagedata This is a reference to an external file such as an image or video. When the file changes, the md5 hash will change to let you know you need to update your localized copy. The msgstr is not used at all. Set it to whatever you like once you have updated your copy of the file.
_
external ref='sockets/serv' md5='__failed__'
44/440
Context English Persian State
Our First Server اولین کارساز ما
Our first server will be somewhat more complex than our first client was: Not only do we have more sockets functions to use, but we need to write it as a daemon. اولین کارساز ما تا حدی از اولین کارخواه ما پیچیده‌تر است: نه تنها توابع سوکت بیشتری برای استفاده داریم، بلکه باید به شکل یک دیمِن آن را بنویسیم.
This is best achieved by creating a <emphasis>child process</emphasis> after binding the port. The main process then exits and returns control to the <application>shell</application> (or whatever program invoked it). بهترین راه برای رسیدن به این مهم، ساخت یک <emphasis>فرایند فرزند</emphasis> پس از پیوست دادن درگاه است. سپس فرایند اصلی خارج شده و نظارت را به <application>shell</application> برمی‌گرداند (یا هر برنامه‌ای که آن را فراخوانده است).
The child calls <function>listen</function>, then starts an endless loop, which accepts a connection, serves it, and eventually closes its socket. فرایند فرزند <function>listen</function> را فراخوانی می‌کند، سپس حلقه‌ای نامتناهی را آغاز می‌کند، که اتصال را می‌پذیرد، به آن رسیدگی می‌کند، و نهایت سوکت آن را می‌بندد.
/*
* daytimed - a port 13 server
*
* Programmed by G. Adam Stanislav
* June 19, 2001
*/
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;time.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;

#define BACKLOG 4

int main() {
register int s, c;
int b;
struct sockaddr_in sa;
time_t t;
struct tm *tm;
FILE *client;

if ((s = socket(PF_INET, SOCK_STREAM, 0)) &lt; 0) {
perror("socket");
return 1;
}

bzero(&amp;sa, sizeof sa);

sa.sin_family = AF_INET;
sa.sin_port = htons(13);

if (INADDR_ANY)
sa.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(s, (struct sockaddr *)&amp;sa, sizeof sa) &lt; 0) {
perror("bind");
return 2;
}

switch (fork()) {
case -1:
perror("fork");
return 3;
break;
default:
close(s);
return 0;
break;
case 0:
break;
}

listen(s, BACKLOG);

for (;;) {
b = sizeof sa;

if ((c = accept(s, (struct sockaddr *)&amp;sa, &amp;b)) &lt; 0) {
perror("daytimed accept");
return 4;
}

if ((client = fdopen(c, "w")) == NULL) {
perror("daytimed fdopen");
return 5;
}

if ((t = time(NULL)) &lt; 0) {
perror("daytimed time");

return 6;
}

tm = gmtime(&amp;t);
fprintf(client, "%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\n",
tm-&gt;tm_year + 1900,
tm-&gt;tm_mon + 1,
tm-&gt;tm_mday,
tm-&gt;tm_hour,
tm-&gt;tm_min,
tm-&gt;tm_sec);

fclose(client);
}
}
/*
* daytimed - a port 13 server
*
* Programmed by G. Adam Stanislav
* June 19, 2001
*/
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;time.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;

#define BACKLOG 4

int main() {
register int s, c;
int b;
struct sockaddr_in sa;
time_t t;
struct tm *tm;
FILE *client;

if ((s = socket(PF_INET, SOCK_STREAM, 0)) &lt; 0) {
perror("socket");
return 1;
}

bzero(&amp;sa, sizeof sa);

sa.sin_family = AF_INET;
sa.sin_port = htons(13);

if (INADDR_ANY)
sa.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(s, (struct sockaddr *)&amp;sa, sizeof sa) &lt; 0) {
perror("bind");
return 2;
}

switch (fork()) {
case -1:
perror("fork");
return 3;
break;
default:
close(s);
return 0;
break;
case 0:
break;
}

listen(s, BACKLOG);

for (;;) {
b = sizeof sa;

if ((c = accept(s, (struct sockaddr *)&amp;sa, &amp;b)) &lt; 0) {
perror("daytimed accept");
return 4;
}

if ((client = fdopen(c, "w")) == NULL) {
perror("daytimed fdopen");
return 5;
}

if ((t = time(NULL)) &lt; 0) {
perror("daytimed time");

return 6;
}

tm = gmtime(&amp;t);
fprintf(client, "%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\n",
tm-&gt;tm_year + 1900,
tm-&gt;tm_mon + 1,
tm-&gt;tm_mday,
tm-&gt;tm_hour,
tm-&gt;tm_min,
tm-&gt;tm_sec);

fclose(client);
}
}
We start by creating a socket. Then we fill out the <varname>sockaddr_in</varname> structure in <varname>sa</varname>. Note the conditional use of <symbol>INADDR_ANY</symbol>: با ایجاد یک سوکت آغاز می‌کنیم. سپس، ساختار <varname>sockaddr_in</varname> را در <varname>sa</varname> پر می‌کنیم. به استفادهٔ مشروط <symbol>INADDR_ANY</symbol> دقت کنید:
if (INADDR_ANY)
sa.sin_addr.s_addr = htonl(INADDR_ANY);
if (INADDR_ANY)
sa.sin_addr.s_addr = htonl(INADDR_ANY);
Its value is <constant>0</constant>. Since we have just used <function>bzero</function> on the entire structure, it would be redundant to set it to <constant>0</constant> again. But if we port our code to some other system where <symbol>INADDR_ANY</symbol> is perhaps not a zero, we need to assign it to <varname>sa.sin_addr.s_addr</varname>. Most modern C compilers are clever enough to notice that <symbol>INADDR_ANY</symbol> is a constant. As long as it is a zero, they will optimize the entire conditional statement out of the code. مقدار آن <constant>0</constant> است. از آنجا که ما از <function>bzero</function> در تمام ساختمان خود استفاده کرده‌ایم، تنظیم کردن دوبارهٔ‌ آن به <constant>0</constant> بیهوده است. اما اگر کدمان را به سامانهٔ دیگری که <symbol>INADDR_ANY</symbol> ممکن است در آن صفر نباشد پورت کنیم، لازم است آن را به <varname>sa.sin_addr.s_addr</varname> تخصیص دهیم. بیشتر همگردان‌های C آنقدر هوشمند هستند که <symbol>INADDR_ANY</symbol> را به‌عنوان یک مقدار ثابت تشخیص دهند. تا زمانی‌که صفر باشد، آنها تمام حکم شرطی را خارج از کد بهینه‌سازی می‌کنند.
After we have called <function>bind</function> successfully, we are ready to become a <emphasis>daemon</emphasis>: We use <function>fork</function> to create a child process. In both, the parent and the child, the <varname>s</varname> variable is our socket. The parent process will not need it, so it calls <function>close</function>, then it returns <constant>0</constant> to inform its own parent it had terminated successfully. پس از آنکه <function>bind</function> را با موفقیت فراخوانی کردیم، آماده‌ایم تا به یک <emphasis>daemon</emphasis> تبدیل شویم: از <function>fork</function> برای ساختن یک فرایند فرزند استفاده می‌کنیم. در هر دو، یعنی والد و فرزند، سوکت ما متغیر <varname>s</varname> هست. فرایند والد به آن نیاز نخواهد داشت، از این رو <function>close</function> را فراخوانی می‌کند، سپس <constant>0</constant> را برمی‌گرداند تا به والد خود اطلاع دهد که با موفقیت از بین رفته است.
Meanwhile, the child process continues working in the background. It calls <function>listen</function> and sets its backlog to <constant>4</constant>. It does not need a large value here because <emphasis>daytime</emphasis> is not a protocol many clients request all the time, and because it can process each request instantly anyway. در این هنگام، فرایند فرزند به کار خود در پس‌زمینه ادامه می‌دهد. <function>listen</function> را فراخوانی می‌کند و backlog آن را بر روی <constant>4</constant> تنظیم می‌کند. در اینجا به مقدار بزرگی نیاز ندارد زیرا <emphasis>روزهنگام</emphasis> قراردادی نیست که بسیاری از کارخواهان تمام وقت درخواستش را بکنند، و چون‌که می‌تواند هر درخواست را به‌سرعت پردازش کند.
Finally, the daemon starts an endless loop, which performs the following steps: سرانجام، دیمِن یک حلقه بی‌نهایت را آغاز می‌کند، که مراحل زیر را انجام می‌دهد:
Call <function>accept</function>. It waits here until a client contacts it. At that point, it receives a new socket, <varname>c</varname>, which it can use to communicate with this particular client. فراخوانی تابع <function>accept</function>. تا زمانی که یک کارخواه اتصال برقرار کند در اینجا صبر می‌کند. در آن هنگام، یک سوکت جدید دریافت می‌کند، <varname>c</varname>، که از آن برای برقراری ارتباط با این کارخواه خاص می‌تواند استفاده کند.
It uses the C function <function>fdopen</function> to turn the socket from a low-level <emphasis>file descriptor</emphasis> to a C-style <varname>FILE</varname> pointer. This will allow the use of <function>fprintf</function> later on. از تابع <function>fdopen</function> در C برای تبدیل <emphasis>توصیف‌گر پرونده</emphasis> سطح پایین به یک اشاره‌گر <varname>FILE</varname> به‌سبک C استفاده می‌کند. این امر بعدتر امکان استفاده از <function>fprintf</function> را فراهم می‌سازد.
It checks the time, and prints it in the <emphasis><acronym>ISO</acronym> 8601</emphasis> format to the <varname>client</varname> <quote>file</quote>. It then uses <function>fclose</function> to close the file. That will automatically close the socket as well. زمان را بررسی می‌کند، و آن را در قالب <emphasis><acronym>ISO</acronym> 8601</emphasis> در <varname>client</varname><quote>file</quote> چاپ می‌کند. سپس از <function>fclose</function> برای بستن پرونده استفاده می‌کند، که به‌طور خودکار سوکت را نیز می‌بندد.
We can <emphasis>generalize</emphasis> this, and use it as a model for many other servers: این را می‌توانیم <emphasis>تعمیم</emphasis> دهیم، و از آن به‌عنوان یک الگو برای بسیاری از کارسازهای دیگر استفاده کنیم:
_ external ref='sockets/serv' md5='__failed__' external ref='sockets/serv' md5='__failed__'
+-----------------+
| Create Socket |
+-----------------+
|
+-----------------+
| Bind Port | Daemon Process
+-----------------+
| +--------+
+-------------+--&gt;| Init |
| | +--------+
+-----------------+ | |
| Exit | | +--------+
+-----------------+ | | Listen |
| +--------+
| |
| +--------+
| | Accept |
| +--------+
| |
| +--------+
| | Serve |
| +--------+
| |
| +--------+
| | Close |
|&lt;--------+
+-----------------+
| Create Socket |
+-----------------+
|
+-----------------+
| Bind Port | Daemon Process
+-----------------+
| +--------+
+-------------+--&gt;| Init |
| | +--------+
+-----------------+ | |
| Exit | | +--------+
+-----------------+ | | Listen |
| +--------+
| |
| +--------+
| | Accept |
| +--------+
| |
| +--------+
| | Serve |
| +--------+
| |
| +--------+
| | Close |
|&lt;--------+
<imageobject> <imagedata fileref="sockets/serv"/> </imageobject> <textobject> <_:literallayout-1/> </textobject> <textobject> <phrase>Sequential Server</phrase> </textobject> <imageobject> <imagedata fileref="sockets/serv"/> </imageobject> <textobject> <_:literallayout-1/> </textobject> <textobject> <phrase>کارساز پی‌درپی</phrase> </textobject>
This flowchart is good for <emphasis>sequential servers</emphasis>, i.e., servers that can serve one client at a time, just as we were able to with our <emphasis>daytime</emphasis> server. This is only possible whenever there is no real <quote>conversation</quote> going on between the client and the server: As soon as the server detects a connection to the client, it sends out some data and closes the connection. The entire operation may take nanoseconds, and it is finished. این روندنما برای <emphasis>کارسازهای پی‌در‌پی</emphasis> مناسب است، برای مثال، کارسازهایی که می‌توانند به یک کارخواه در لحظه خدمت‌رسانی کنند، همانند آنچه که با کارساز <emphasis>روزهنگام</emphasis> خود می‌کردیم. این تنها زمانی‌كه هیچ <quote>مکالمهٔ</quote> حقیقی‌ای بین کارخواه و کارساز در جریان نباشد ممکن است. هنگامی‌که کارساز اتصالی به کارخواه تشخیص داد، تعدادی داده ارسال می‌کند و اتصال را می‌بندد. تمام عملیات ممکن است طی چند نانوثانیه اتفاق بیفتد، و تمام می‌شود.
The advantage of this flowchart is that, except for the brief moment after the parent <function>fork</function>s and before it exits, there is always only one <emphasis>process</emphasis> active: Our server does not take up much memory and other system resources. برتری این روندنما در این است که به‌غیر از لحظه‌ای کوتاه پس از <function>fork</function> کردن والد و پیش از خروجش، همیشه تنها یک <emphasis>فرایند</emphasis> فعال وجود دارد: کارساز ما حافظه و سایر منابع سامانهٔ زیادی را نمی گیرد.
Note that we have added <emphasis>initialize daemon</emphasis> in our flowchart. We did not need to initialize our own daemon, but this is a good place in the flow of the program to set up any <function>signal</function> handlers, open any files we may need, etc. توجه داشته باشید که ما <emphasis>دیمِن مقداردهی اولیه</emphasis> را در روندنمای خود اضافه کرده‌ایم. نیازی به مقداردهی دیمن خودمان نبود، اما این مکان خوبی برای تنظیم هرگونه سامان‌ده <function>signal</function>، باز کردن هر پرونده‌ای که ممکن است نیاز داشته باشیم، و غیره در روندنما است.
Just about everything in the flow chart can be used literally on many different servers. The <emphasis>serve</emphasis> entry is the exception. We think of it as a <emphasis><quote>black box</quote></emphasis>, i.e., something you design specifically for your own server, and just <quote>plug it into the rest.</quote> تقریباً‌ تمام مواردی که در روندنما موجود هستند را می‌توان به‌واقع در بسیاری از کارسازهای گوناگون به‌کار برد. ورودی <emphasis>serve</emphasis> یک استثناست. ما به آن به‌عنوان یک <emphasis><quote>جعبه سیاه</quote></emphasis> نگاه می‌کنیم، برای مثال، چیزی که به‌طور خاص برای کارساز خود طراحی می‌کنید، و فقط <quote>آن را به باقی متصل می‌کنید.</quote>
Not all protocols are that simple. Many receive a request from the client, reply to it, then receive another request from the same client. Because of that, they do not know in advance how long they will be serving the client. Such servers usually start a new process for each client. While the new process is serving its client, the daemon can continue listening for more connections. همهٔ قراردادها به این سادگی نیستند. بسیاری درخواست را از کارخواه دریافت می‌کنند، به آن پاسخ می‌دهند، سپس درخواست دیگری از همان کارخواه دریافت می‌کنند. از این رو، از پیش نمی‌دانند چه مدت به کارخواه خدمت‌رسانی می‌کنند. چنین کارسازهایی معمولاً‌ یک فرایند برای هر کارخواه آغاز می‌کنند. هنگامی‌که فرایند جدید در حال ارائهٔ خدمات به کارخواه خود است، دیمِن می‌تواند به گوش دادن برای اتصالات بیشتر ادامه دهد.
Now, go ahead, save the above source code as <filename>daytimed.c</filename> (it is customary to end the names of daemons with the letter <constant>d</constant>). After you have compiled it, try running it: اکنون، پیش بروید و کد منبع فوق را تحت عنوان <filename>daytimed.c</filename> ذخیره کنید (مرسوم است که نام دیمِن‌ها به حرف <constant>d</constant> ختم شوند). بعد از اینکه آن را همگردانی کردید، اجرایش کنید:
<prompt>%</prompt> <userinput>./daytimed</userinput>
bind: Permission denied
<prompt>%</prompt>
<prompt>%</prompt> <userinput>./daytimed</userinput>
bind: Permission denied
<prompt>%</prompt>
What happened here? As you will recall, the <emphasis>daytime</emphasis> protocol uses port 13. But all ports below 1024 are reserved to the superuser (otherwise, anyone could start a daemon pretending to serve a commonly used port, while causing a security breach). در اینجا چه اتفاقی افتاد؟ همانطور که به یاد خواهید داشت، قرارداد <emphasis>روزهنگام</emphasis> از درگاه ۱۳ استفاده می‌کند. اما تمام درگاه‌های زیر ۱۰۲۴ به ابرکاربر اختصاص داده شده‌اند (در غیر اینصورت، هر شخص می‌توانست دیمنی آغاز کند که تظاهر به خدمت رسانی به یک درگاه معمولی را کند، در حالی‌که باعث نقض امنیتی می‌شود).
Try again, this time as the superuser: دوباره امتحان کنید، این بار به‌عنوان ابرکاربر:
<prompt>#</prompt> <userinput>./daytimed</userinput>
<prompt>#</prompt>
<prompt>#</prompt> <userinput>./daytimed</userinput>
<prompt>#</prompt>
What... Nothing? Let us try again: عجب... هیچ چیز؟ بگذارید مجدد امتحان کنیم:
<prompt>#</prompt> <userinput>./daytimed</userinput>

bind: Address already in use
<prompt>#</prompt>
<prompt>#</prompt> <userinput>./daytimed</userinput>

bind: Address already in use
<prompt>#</prompt>
Every port can only be bound by one program at a time. Our first attempt was indeed successful: It started the child daemon and returned quietly. It is still running and will continue to run until you either kill it, or any of its system calls fail, or you reboot the system. هر درگاه تنها می‌تواند در لحظه به یک برنامه مقید باشد. تلاش اول ما حقیقتاً موفقیت آمیز بود: دیمِن فرزند را آغاز کرد و به آرامی بازگشت. هنوز در حال اجراست و تا زمانی که یا آنرا از بین ببرید، یا هر کدام از فراخوان‌های سامانه موفق نشوند، یا شما سامانه را مجدد راه‌اندازی کنید به اجرا شدن ادامه می‌دهد.

Loading…

external ref='sockets/serv' md5='__failed__'
external ref='sockets/serv' md5='__failed__'
2 months ago
Browse all component changes

Things to check

Unchanged translation

Source and translation are identical

Reset

Glossary

English Persian
No related strings found in the glossary.

Source information

Context
_
Source string comment
(itstool) path: imageobject/imagedata This is a reference to an external file such as an image or video. When the file changes, the md5 hash will change to let you know you need to update your localized copy. The msgstr is not used at all. Set it to whatever you like once you have updated your copy of the file.
Source string location
book.translate.xml:6168
String age
4 months ago
Source string age
a year ago
Translation file
books/fa/developers-handbook.po, string 1004