getaddrinfo是一個網絡函數,用于將主機名和服務名轉換為套接字地址信息。在MySQL中,getaddrinfo函數被廣泛使用,以便在UDP和TCP套接字之間執行交互。
struct addrinfo {
int ai_flags; // 用于指定getaddrinfo函數的使用方式
int ai_family; // 指定套接字的地址族類型
int ai_socktype; // 指定套接字的套接字類型
int ai_protocol; // 指定套接字的通信協議
size_t ai_addrlen; // 指定套接字地址的長度
struct sockaddr *ai_addr; // 指向套接字地址結構體的指針
char *ai_canonname; // 存儲正式主機名的字符串指針
struct addrinfo *ai_next; // 鏈表中下一個addrinfo結構體的指針
};
MySQL中使用getaddrinfo函數需要指定主機名和服務名,通常是在建立連接時使用。以下是建立MySQL連接時的示例:
int sockfd;
struct addrinfo hints, *servinfo, *p;
char hostname[] = "localhost";
char port[] = "3306";
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if (getaddrinfo(hostname, port, &hints, &servinfo) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
for (p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
fprintf(stderr, "socket error\n");
continue;
}
if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
fprintf(stderr, "connect error\n");
continue;
}
break;
}
if (p == NULL) {
fprintf(stderr, "failed to connect\n");
exit(1);
}
freeaddrinfo(servinfo);
以上代碼將主機名設置為localhost,服務名設置為3306(MySQL默認端口號),使用TCP套接字進行連接。如果連接失敗,則會嘗試使用下一個addrinfo結構體,直到連接成功或者遍歷完整個鏈表。如果遍歷完整個鏈表時仍無法連接成功,則退出程序。