====== تابع ()listen ======
در سرورهای tcp این تابع یک socket file descriptor را که از [[socket]] به دست آمده و با [[bind]] به یک پورت مربوط شده را به عنوان passive socket علامت میزند. یک passive socket نو عی سوکت است که برای قبول کانکشنهای client ها از [[accept]] استفاده خواهد کرد.
#include
#include
int listen(int sockfd, int backlog);
پارامتر backlog مشخص میکند چه تعدادی درخواست در صف منتظر فراخوانی [[accept]] هستند. بعد از کرنل 2.2 این تعداد نشان دهنده تعداد کانکشن های established شده ای است که در صف منتظرند.
ماکزیمم کانکشن هایی که هنوز established نشده اند در proc/sys/net/ipv4/tcp_max_syn_backlog/ مشخص می شود. اگر syncookies در کرنل enable باشد این مقدار بدون ماکزیمم است.
اگر مقدار blacklog بیشتر از مقدار proc/sys/net/core/somaxconn/ باشد به مقدار somaxconn تبدیل میشود. از کرنل 5.4 به بعد این مقدار پیش فرض 4096 است که در گذشته 128 بوده.
مثال
#include
#include
#include
#include
#include
#include
#include
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while(0)
#define PORT "3450"
#define BACKLOG 120
int main()
{
int status, sockfd, option;
struct addrinfo hints, *res, *rp;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
status = getaddrinfo(NULL, PORT, &hints, &res);
if (status != 0) {
fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(status));
exit(EXIT_FAILURE);
}
for (rp = res; rp != NULL; rp = rp->ai_next) {
sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
if (sockfd == -1) {
perror("socket() error");
continue;
}
option = 1;
status = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
if (status == -1)
handle_error("setsockopt() error");
status = bind(sockfd, rp->ai_addr, rp->ai_addrlen);
if (status == -1) {
perror("bind() error");
close(sockfd);
continue;
}
break;
}
freeaddrinfo(res);
if (rp == NULL) {
fprintf(stderr,"Server: failed to not bind\n");
exit(EXIT_FAILURE);
}
status = listen(sockfd, BACKLOG);
if (status == -1)
handle_error("linsten() error");
fprintf(stdout, "Listening started ... \n");
fprintf(stdout, "You can check netstat for 60 seconds\n");
sleep(60);
fprintf(stdout, "End.\n");
close(sockfd);
return 0;
}
خروجی
Listening started ...
You can check netstat for 60 seconds
End.