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/serv2' md5='__failed__'
45/450
Context English Persian State
/*
* daytime.c
*
* Programmed by G. Adam Stanislav
* 19 June 2001
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc, char *argv[]) {
register int s;
register int bytes;
struct sockaddr_in sa;
struct hostent *he;
char buf[BUFSIZ+1];
char *host;

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

bzero(&sa, sizeof sa);

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

host = (argc > 1) ? (char *)argv[1] : "time.nist.gov";

if ((he = gethostbyname(host)) == NULL) {
herror(host);
return 2;
}

bcopy(he->h_addr_list[0],&sa.sin_addr, he->h_length);

if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
perror("connect");
return 3;
}

while ((bytes = read(s, buf, BUFSIZ)) > 0)
write(1, buf, bytes);

close(s);
return 0;
}
/*
* daytime.c
*
* Programmed by G. Adam Stanislav
* 19 June 2001
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc, char *argv[]) {
register int s;
register int bytes;
struct sockaddr_in sa;
struct hostent *he;
char buf[BUFSIZ+1];
char *host;

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

bzero(&sa, sizeof sa);

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

host = (argc > 1) ? (char *)argv[1] : "time.nist.gov";

if ((he = gethostbyname(host)) == NULL) {
herror(host);
return 2;
}

bcopy(he->h_addr_list[0],&sa.sin_addr, he->h_length);

if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
perror("connect");
return 3;
}

while ((bytes = read(s, buf, BUFSIZ)) > 0)
write(1, buf, bytes);

close(s);
return 0;
}
We now can type a domain name (or an <acronym>IP</acronym> address, it works both ways) on the command line, and the program will try to connect to its <emphasis>daytime</emphasis> server. Otherwise, it will still default to <systemitem class="fqdomainname">time.nist.gov</systemitem>. However, even in this case we will use <function>gethostbyname</function> rather than hard coding <systemitem class="ipaddress">192.43.244.18</systemitem>. That way, even if its <acronym>IP</acronym> address changes in the future, we will still find it. اکنون می‌توانیم یک نام دامنه (یا یک نشانی <acronym>IP</acronym>، با هر دو روش کار می‌کند) در خط فرمان وارد کنیم، و برنامه سعی می‌کند به کارساز <emphasis>روزهنگام</emphasis> خود متصل شود. در غیر اینصورت، به <systemitem class="fqdomainname">time.nist.gov</systemitem> پیش‌فرض می‌شود. هرچند، حتی در این مورد به جای سخت کد کردن <systemitem class="ipaddress">192.43.244.18</systemitem> از <function>gethostbyname</function> استفاده می‌کنیم. در اینصورت، حتی اگر نشانی <acronym>IP</acronym> آن در آینده تغییر کند، ما آن را پیدا خواهیم کرد.
Since it takes virtually no time to get the time from your local server, you could run <application>daytime</application> twice in a row: First to get the time from <systemitem class="fqdomainname">time.nist.gov</systemitem>, the second time from your own system. You can then compare the results and see how exact your system clock is: از آنجا که هیچ زمانی را صرف گرفتن زمان از کارساز محلی شما نمی‌کند، می‌توانید <application>daytime</application> را دو بار پشت سر هم اجرا کنید: بار اول برای گرفتن زمان از <systemitem class="fqdomainname">time.nist.gov</systemitem>، بار دوم برای گرفتن از سامانهٔ خودتان. سپس می‌توانید نتایج را مقایسه کنید و دقت ساعت سامانهٔ خود را ببینید:
<prompt>%</prompt> <userinput>daytime ; daytime localhost</userinput>


52080 01-06-20 04:02:33 50 0 0 390.2 UTC(NIST) *
2001-06-20T04:02:35Z
<prompt>%</prompt>
<prompt>%</prompt> <userinput>daytime ; daytime localhost</userinput>


52080 01-06-20 04:02:33 50 0 0 390.2 UTC(NIST) *
2001-06-20T04:02:35Z
<prompt>%</prompt>
As you can see, my system was two seconds ahead of the <acronym>NIST</acronym> time. همانطور که مشاهده می‌کنید، سامانهٔ من دو ثانیه جلوتر از زمان <acronym>NIST</acronym> بود.
<function>getservbyname</function> <function>getservbyname</function>
Sometimes you may not be sure what port a certain service uses. The <citerefentry><refentrytitle>getservbyname</refentrytitle><manvolnum>3</manvolnum></citerefentry> function, also declared in <filename>netdb.h</filename> comes in very handy in those cases: گاهی ممکن است از درگاهی که یک سرویس خاص از آن استفاده می‌کند مطمئن نباشید. تابع <citerefentry><refentrytitle>getservbyname</refentrytitle><manvolnum>3</manvolnum></citerefentry>، که نیز در <filename>netdb.h</filename> تعریف شده است در چنین مواردی مفید است:
struct servent * getservbyname(const char *name, const char *proto); struct servent * getservbyname(const char *name, const char *proto);
The <varname>servent</varname> structure contains the <varname>s_port</varname>, which contains the proper port, already in <emphasis>network byte order</emphasis>. ساختمان <varname>servent</varname> شامل <varname>s_port</varname> است، که شامل درگاه مناسب است، و از پیش در <emphasis>ترتیب بایت شبکه</emphasis> است.
Had we not known the correct port for the <emphasis>daytime</emphasis> service, we could have found it this way: چنانچه درگاه مناسب برای سرویس <emphasis>روزهنگام</emphasis> را نمی‌دانستیم، می‌توانستیم آن را با این روش بیابیم:
struct servent *se;
...
if ((se = getservbyname("daytime", "tcp")) == NULL {
fprintf(stderr, "Cannot determine which port to use.\n");
return 7;
}
sa.sin_port = se-&gt;s_port;
struct servent *se;
...
if ((se = getservbyname("daytime", "tcp")) == NULL {
fprintf(stderr, "Cannot determine which port to use.\n");
return 7;
}
sa.sin_port = se-&gt;s_port;
You usually do know the port. But if you are developing a new protocol, you may be testing it on an unofficial port. Some day, you will register the protocol and its port (if nowhere else, at least in your <filename>/etc/services</filename>, which is where <function>getservbyname</function> looks). Instead of returning an error in the above code, you just use the temporary port number. Once you have listed the protocol in <filename>/etc/services</filename>, your software will find its port without you having to rewrite the code. شما معمولاً درگاه را می‌شناسید. اما اگر مشغول توسعه‌دهی قراردادی جدید هستید، ممکن است آن را در درگاهی غیر رسمی بیازمایید. یک روز، قرارداد و درگاهش را ثبت می‌کنید (اگر نه جای دیگر، حداقل در <filename>/etc/services</filename>، که همانجاست که تابع <function>getservbyname</function> به‌دنبالش می‌گردد). به جای بازگرداندن پیام خطا در کد بالا، تنها از شمارهٔ درگاه موقت استفاده کنید. هنگامی‌که قرارداد را در <filename>/etc/services</filename> قرار دادید، نرم‌افزارتان درگاه خود را بدون آنکه شما نیازی به بازنویسی کد داشته باشید پیدا خواهد کرد.
Concurrent Servers کارسازهای هم‌رو
Unlike a sequential server, a <emphasis>concurrent server</emphasis> has to be able to serve more than one client at a time. For example, a <emphasis>chat server</emphasis> may be serving a specific client for hours—it cannot wait till it stops serving a client before it serves the next one. بر خلاف کارساز پی‌در‌پی، یک <emphasis>کارساز هم‌رو</emphasis> باید بتواند به بیش از یک کارخواه به‌طور همزمان خدمت‌رسانی کند. برای مثال، یک <emphasis>کارساز چت</emphasis> ممکن است برای ساعت‌ها به یک کارخواه خاص خدمت‌رسانی کند—قبل از آنکه به کارخواه بعدی خدمت‌ کند نمی‌تواند منتظر بماند تا خدمت‌رسانی به یک کارخواه را متوقف سازد.
This requires a significant change in our flowchart: این نیازمند تغییری چشم‌گیر در روندنمایمان است:
_ external ref='sockets/serv2' md5='__failed__' external ref='sockets/serv2' md5='__failed__'
+-----------------+
| Create Socket |
+-----------------+
|
+-----------------+
| Bind Port | Daemon Process
+-----------------+
| +--------+
+-------------+--&gt;| Init |
| | +--------+
+-----------------+ | |
| Exit | | +--------+
+-----------------+ | | Listen |
| +--------+
| |
| +--------+
| | Accept |
| +--------+
| | +------------------+
| +------&gt;| Close Top Socket |
| | +------------------+
| +--------+ |
| | Close | +------------------+
| +--------+ | Serve |
| | +------------------+
|&lt;--------+ |
+------------------+
| Close Acc Socket |
+--------+ +------------------+
| Signal | |
+--------+ +------------------+
| Exit |
+------------------+
+-----------------+
| Create Socket |
+-----------------+
|
+-----------------+
| Bind Port | Daemon Process
+-----------------+
| +--------+
+-------------+--&gt;| Init |
| | +--------+
+-----------------+ | |
| Exit | | +--------+
+-----------------+ | | Listen |
| +--------+
| |
| +--------+
| | Accept |
| +--------+
| | +------------------+
| +------&gt;| Close Top Socket |
| | +------------------+
| +--------+ |
| | Close | +------------------+
| +--------+ | Serve |
| | +------------------+
|&lt;--------+ |
+------------------+
| Close Acc Socket |
+--------+ +------------------+
| Signal | |
+--------+ +------------------+
| Exit |
+------------------+
<imageobject> <imagedata fileref="sockets/serv2"/> </imageobject> <textobject> <_:literallayout-1/> </textobject> <textobject> <phrase>Concurrent Server</phrase> </textobject> <imageobject> <imagedata fileref="sockets/serv2"/> </imageobject> <textobject> <_:literallayout-1/> </textobject> <textobject> <phrase>کارساز هم‌رو</phrase> </textobject>
We moved the <emphasis>serve</emphasis> from the <emphasis>daemon process</emphasis> to its own <emphasis>server process</emphasis>. However, because each child process inherits all open files (and a socket is treated just like a file), the new process inherits not only the <emphasis><quote>accepted handle,</quote></emphasis> i.e., the socket returned by the <function>accept</function> call, but also the <emphasis>top socket</emphasis>, i.e., the one opened by the top process right at the beginning. ما <emphasis>serve</emphasis> را از <emphasis>فرایند دیمن</emphasis> به <emphasis>فرایند کارساز</emphasis> خودش منتقل کردیم. گرچه، از آنجا که هر فرایند فرزند تمام پرونده‌های باز را به ارث می‌برد (و با یک سوکت همانند یک پرونده برخورد می‌شود)، فرایند جدید نه تنها <emphasis><quote>accepted handle،</quote></emphasis> برای مثال، سوکتی که با فراخوان <function>accept</function> بازگشت داده شده، بلکه همچنین <emphasis>top socket</emphasis>، برای مثال، همان که توسط فرایند برتر در ابتدا باز شده است، را به ارث می‌برد.
However, the <emphasis>server process</emphasis> does not need this socket and should <function>close</function> it immediately. Similarly, the <emphasis>daemon process</emphasis> no longer needs the <emphasis>accepted socket</emphasis>, and not only should, but <emphasis>must</emphasis> <function>close</function> it—otherwise, it will run out of available <emphasis>file descriptors</emphasis> sooner or later. هرچند، <emphasis>فرایند کارساز</emphasis> به این سوکت نیازی ندارد و باید آن را به سرعت <function>close</function> کند. به همین ترتیب، <emphasis>فرایند دیمن</emphasis> دیگر نیازی به <emphasis>سوکت پذیرفته‌شده</emphasis> ندارد، و نه تنها باید، بلکه <emphasis>باید</emphasis> آن را <function> close</function> کند—در غیر اینصورت، دیر یا زود <emphasis>توصیف‌گرهای پروندهٔ</emphasis> موجود به پایان می‌رسند.
After the <emphasis>server process</emphasis> is done serving, it should close the <emphasis>accepted socket</emphasis>. Instead of returning to <function>accept</function>, it now exits. پس از آنکه <emphasis>فرایند کارساز</emphasis> به خدمت‌رسانی خود پایان داد، باید <emphasis>سوکت پذیرفته‌شده</emphasis> را ببندد. به‌جای بازگشت به <function>accept</function>، اکنون خارج می‌شود.
Under <trademark class="registered">UNIX</trademark>, a process does not really <emphasis>exit</emphasis>. Instead, it <emphasis>returns</emphasis> to its parent. Typically, a parent process <function>wait</function>s for its child process, and obtains a return value. However, our <emphasis>daemon process</emphasis> cannot simply stop and wait. That would defeat the whole purpose of creating additional processes. But if it never does <function>wait</function>, its children will become <emphasis>zombies</emphasis>—no longer functional but still roaming around. تحت <trademark class="registered">UNIX</trademark>، یک فرایند به‌طور حقیقی <emphasis>خروج</emphasis> نمی‌کند. در عوض، به والد خود <emphasis>برمی‌گردد</emphasis>. معمولاً، یک فرایند فرزند <function>منتظر</function> فرایند‌های فرزند خود می‌ماند، و مقدار بازگشتی را بدست می‌آورد. گرچه، <emphasis>فرایند دیمن</emphasis> ما نمی‌تواند به‌سادگی متوقف شود و منتظر بماند. این امر می‌تواند تمام هدف ساختن فرایندهای اضافی را زیر سوال برد. اما چنانچه هرگز <function>منتظر</function> نماند، فرزندان آن تبدیل به <emphasis>زامبی</emphasis> می‌شوند—فاقد کارکرد اما هنوز مشغول پرسه‌زنی در اطراف.
For that reason, the <emphasis>daemon process</emphasis> needs to set <emphasis>signal handlers</emphasis> in its <emphasis>initialize daemon</emphasis> phase. At least a <symbol>SIGCHLD</symbol> signal has to be processed, so the daemon can remove the zombie return values from the system and release the system resources they are taking up. از این رو، <emphasis>فرایند دیمن</emphasis> باید در فاز <emphasis>initialize daemon</emphasis> خود <emphasis>signal handlers</emphasis> را قرار دهد. حداقل یک سیگنال <symbol>SIGCHLD</symbol> باید پردازش شود، تا دیمن بتواند مقادیر بازگشتی زامبی را از سامانه حذف کند و منابع سامانه‌ای که اشغال می‌کنند را آزاد کند.
That is why our flowchart now contains a <emphasis>process signals</emphasis> box, which is not connected to any other box. By the way, many servers also process <symbol>SIGHUP</symbol>, and typically interpret as the signal from the superuser that they should reread their configuration files. This allows us to change settings without having to kill and restart these servers. به همین خاطر روندنمای ما اکنون شامل یک جعبهٔ <emphasis>process signals</emphasis> است، که به هیچ جعبهٔ دیگری متصل نیست. در ضمن، بسیاری از کارسازها نیز <symbol>SIGHUP</symbol> را پردازش می‌کنند، و معمولاً‌ به‌عنوان سیگنالی از ابرکابری تفسیر می‌کنند که باید پرونده‌های پیکربندی‌شان را بازخوانی کنند. این به ما اجازه می‌دهد تا تنظیمات را تغییر دهیم، بدون آنکه مجبور به از بین بردن و باز‌راه اندازی این کارسازها باشیم.
IPv6 Internals داخلی‌های IPv6
IPv6/IPsec Implementation پیاده‌سازی IPv6/IPsec
<personname> <firstname>Yoshinobu</firstname> <surname>Inoue</surname> </personname> <contrib>Contributed by </contrib> <personname> <firstname>Yoshinobu</firstname> <surname>Inoue</surname> </personname> <contrib>نوشته شده توسط </contrib>
This section should explain IPv6 and IPsec related implementation internals. These functionalities are derived from <link xlink:href="http://www.kame.net/">KAME project</link> این بخش باید داخلی‌های مرتبط با پیاده‌سازی IPv6 و IPsec را توضیح دهد. این کارکردها از <link xlink:href="http://www.kame.net/">KAME project</link> مشتق شده‌اند
IPv6 IPv6
Conformance انطباق
The IPv6 related functions conforms, or tries to conform to the latest set of IPv6 specifications. For future reference we list some of the relevant documents below (<emphasis>NOTE</emphasis>: this is not a complete list - this is too hard to maintain...). توابع مربوط به IPv6 منطبق با، یا سعی بر تطابق با آخرین مجموعه از مشخصات IPv6 دارد. برای ارجاعات بعدی برخی مستندات مرتبط را در قسمت پایین فهرست می‌کنیم (<emphasis>توجه</emphasis>: این یک فهرست کامل نیست - حفظ آن بسیار سخت است...).

Loading…

external ref='sockets/serv2' md5='__failed__'
external ref='sockets/serv2' 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:6508
String age
4 months ago
Source string age
a year ago
Translation file
books/fa/developers-handbook.po, string 1050