====== کتابخانه توابع ====== // get sockaddr, IPv4 or IPv6: void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); } return &(((struct sockaddr_in6*)sa)->sin6_addr); } #include #include #include #include #include #include #include int get_listener_socket(char *ipv4str, char *port) { int status, sockfd, sockopt; struct addrinfo hints, *res, *rp; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; status = getaddrinfo(ipv4str, port, &hints, &res); if (status != 0) { fprintf(stderr, "getaddrinfo() error: %s\n", gai_strerror(status)); return -1; } 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; } sockopt = 1; status = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&sockopt, sizeof(sockopt)); if (status == -1) { perror("setsockopt() error "); close(sockfd); continue; } status = bind(sockfd, rp->ai_addr, rp->ai_addrlen); if (status == -1) { perror("bind() error "); close(sockfd); continue; } break; } freeaddrinfo(res); if (rp == NULL) { return -1; } // BACKLOG 120 status = listen(sockfd, 120); if (status == -1) { perror("listen() error"); close(sockfd); return -1; } return sockfd; }