c-socket-programming:socket
این یک نگارش قدیمی از این مطلب است!
تابع ()socket
از تابع ()socket برای دریافت یک file descriptor جهت ارتباط با شبکه یا پروسس های دیگر، استفاده میشود.
// man 2 socket #include <sys/types.h> #include <sys/socket.h> sockfd = socket(int socket_family, int socket_type, int protocol);
بهتر است تمام ورودی های تابع ()socket از طریق تابع ()getaddrinfo آماده شود. درواقع domain همان rp→ai_family و type همان rp→ai_socktype و protocol همان rp→ai_protocol است. باید تک تک استراکچر های linked-listی که تابع ()getaddrinfo برگردانده بررسی شود تا بالاخره بتوانیم هم از طریق تابع ()socket یک file descriptor بگیریم هم از طریق تابع ()bind به port متصل شویم.
مثال برای گرفتن file descriptor توسط تابع ()socket با کنترل تک تک استراکچرهای linked-list آماده شده توسط تابع ()getaddrinfo :
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) #define PORT "3440" int main() { int sockfd, errcode; struct addrinfo hints, *res, *rp; 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; /* For wildcard IP address */ errcode = getaddrinfo(NULL, PORT, &hints, &res); if (errcode != 0) { fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(errcode)); 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; } 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 a %s socket for %s = %d\n", ipver, ipstr, sockfd); close(sockfd); } freeaddrinfo(res); return 0; }
خروجی
I got a IPv4 socket for 0.0.0.0 = 3 I got a IPv6 socket for :: = 3
c-socket-programming/socket.1718773371.txt.gz · آخرین ویرایش: 2024/06/19 08:32 توسط pejman
