====== تابع ()bind ====== در هر server پس از گرفتن file descriptor از طریق [[socket]] باید آن را به یک port متصل کنیم تا برای [[listen]] آماده باشد. این کار توسط [[bind]] انجام میشود. #include #include int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); تمام ورودی های [[bind]] از طریق [[getaddrinfo]] و [[socket]] آماده میشود. sockfd همان file descriptor حاصل از [[socket]] است و addr هم همان rp->ai_addr و addrlen هم همان rp->ai_addrlen است.باید تک تک استراکچر های linked-listی که [[getaddrinfo]] برگردانده بررسی شود تا بالاخره بتوانیم هم از طریق [[socket]] یک file descriptor بگیریم هم از طریق [[bind]] به port متصل شویم. مثال برای گرفتن file descriptor توسط [[socket]] و اتصال به یک port از طریق [[bind]] ، با کنترل تک تک استراکچرهای linked-list آماده شده توسط [[getaddrinfo]] : #include #include #include #include #include #include #include #include #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) #define PORT "3440" int main() { int status; struct addrinfo hints, *res, *rp; int sockfd; char *ipver, ipstr[INET6_ADDRSTRLEN]; void *addr; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; 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) { handle_error("socket() error"); continue; } status = bind(sockfd, rp->ai_addr, rp->ai_addrlen); if (status == 0) break; handle_error("bind() error"); close(sockfd); } if (rp == NULL) { fprintf(stderr, "Could not bind\n"); exit(EXIT_FAILURE); } if (rp->ai_family == AF_INET) { ipver = "IPv4"; addr = &(((struct sockaddr_in*)(rp->ai_addr))->sin_addr); } else { ipver = "IPv6"; addr = &(((struct sockaddr_in6*)(rp->ai_addr))->sin6_addr); } inet_ntop(rp->ai_family, addr, ipstr, sizeof ipstr); fprintf(stdout, "I got an %s socket for %s and bind to %s = %d\n", ipver, ipstr, PORT ,sockfd); close(sockfd); freeaddrinfo(res); return 0; } خروجی I got an IPv4 socket for 0.0.0.0 and bind to 3440 = 3