====== کتابخانه توابع ======
// 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;
}