socket-programming:listen
تفاوتها
تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده میکنید.
| socket-programming:listen [2024/06/18 00:28] – ایجاد شد pejman | socket-programming:listen [2024/06/18 01:00] (فعلی) – حذف شد pejman | ||
|---|---|---|---|
| خط 1: | خط 1: | ||
| - | ====== تابع ()listen ====== | ||
| - | |||
| - | در سرورهای tcp این تابع یک socket file descriptor را که از [[socket]] به دست آمده و با [[bind]] به یک پورت مربوط شده را به عنوان passive socket علامت میزند. یک passive socket نو عی سوکت است که برای قبول کانکشنهای client ها از [[accept]] استفاده خواهد کرد. | ||
| - | |||
| - | <code C> | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | int listen(int sockfd, int backlog); | ||
| - | </ | ||
| - | |||
| - | پارامتر backlog مشخص میکند چه تعدادی درخواست در صف منتظر فراخوانی [[accept]] هستند. بعد از کرنل 2.2 این تعداد نشان دهنده تعداد کانکشن های established شده ای است که در صف منتظرند. | ||
| - | |||
| - | ماکزیمم کانکشن هایی که هنوز established نشده اند در proc/ | ||
| - | |||
| - | اگر مقدار blacklog بیشتر از مقدار proc/ | ||
| - | |||
| - | مثال | ||
| - | <code C> | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | #define handle_error(msg) \ | ||
| - | do { perror(msg); | ||
| - | |||
| - | #define PORT " | ||
| - | #define BACKLOG 120 | ||
| - | |||
| - | int main() | ||
| - | { | ||
| - | int status, sockfd, option; | ||
| - | struct addrinfo hints, *res, *rp; | ||
| - | |||
| - | memset(& | ||
| - | hints.ai_family = AF_UNSPEC; | ||
| - | hints.ai_socktype = SOCK_STREAM; | ||
| - | hints.ai_protocol = 0; | ||
| - | |||
| - | status = getaddrinfo(NULL, | ||
| - | if (status != 0) { | ||
| - | fprintf(stderr, | ||
| - | exit(EXIT_FAILURE); | ||
| - | } | ||
| - | |||
| - | for (rp = res; rp != NULL; rp = rp-> | ||
| - | |||
| - | sockfd = socket(rp-> | ||
| - | if (sockfd == -1) { | ||
| - | perror(" | ||
| - | continue; | ||
| - | } | ||
| - | |||
| - | option = 1; | ||
| - | status = setsockopt(sockfd, | ||
| - | if (status == -1) | ||
| - | handle_error(" | ||
| - | | ||
| - | status = bind(sockfd, | ||
| - | if (status == -1) { | ||
| - | perror(" | ||
| - | close(sockfd); | ||
| - | continue; | ||
| - | } | ||
| - | |||
| - | break; | ||
| - | } | ||
| - | freeaddrinfo(res); | ||
| - | |||
| - | if (rp == NULL) { | ||
| - | fprintf(stderr," | ||
| - | exit(EXIT_FAILURE); | ||
| - | } | ||
| - | |||
| - | status = listen(sockfd, | ||
| - | if (status == -1) | ||
| - | handle_error(" | ||
| - | |||
| - | fprintf(stdout, | ||
| - | fprintf(stdout, | ||
| - | sleep(60); | ||
| - | fprintf(stdout, | ||
| - | | ||
| - | close(sockfd); | ||
| - | |||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | خروجی | ||
| - | |||
| - | Listening started ... | ||
| - | You can check netstat for 60 seconds | ||
| - | End. | ||
socket-programming/listen.1718657933.txt.gz · آخرین ویرایش: 2024/06/18 00:28 توسط pejman
