socket
或第三方库如
requests
。
在C语言中,获取域名和端口通常涉及到网络编程的基础知识,以下是详细的步骤和代码示例,帮助你理解如何在C语言中实现这一功能:
你需要创建一个套接字(socket),这可以通过socket()
函数来实现。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { int sockfd; struct sockaddr_in server_addr; // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("Socket creation failed"); exit(EXIT_FAILURE); } // 定义服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); // 端口号 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 本地回环地址 // 连接服务器 if (connect(sockfd, (struct sockaddr )&server_addr, sizeof(server_addr)) < 0) { perror("Connection failed"); close(sockfd); exit(EXIT_FAILURE); } printf("Connected to the server at port %d ", ntohs(server_addr.sin_port)); // 关闭套接字 close(sockfd); return 0; }
如果你有一个域名,并希望获取其对应的IP地址,可以使用gethostbyname()
函数。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <arpa/inet.h> int main() { struct hostent he; struct in_addr addr_list; int i; if ((he = gethostbyname("www.example.com")) == NULL) { herror("gethostbyname"); return 1; } addr_list = (struct in_addr ) he->h_addr_list; for(i = 0; addr_list[i] != NULL; i++) { printf("%s ", inet_ntoa(addr_list[i])); } printf(" "); return 0; }
如果你需要更高层次的网络操作,比如HTTP请求,可以使用libcurl库,以下是一个使用libcurl获取URL的主机名和端口的示例。
#include <stdio.h> #include <curl/curl.h> int main() { CURL curl; CURLcode res; char url = "http://www.example.com"; char hostname[256]; long port; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); // 不下载主体内容 res = curl_easy_perform(curl); if(res == CURLE_OK) { curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, hostname); curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT, &port); printf("Host: %s, Port: %ld ", hostname, port); } else { fprintf(stderr, "curl_easy_perform() failed: %s ", curl_easy_strerror(res)); } curl_easy_cleanup(curl); } return 0; }
你也可以手动解析一个URL字符串来获取域名和端口,以下是一个简单示例:
#include <stdio.h> #include <string.h> void parse_url(const char url, char hostname, int port) { const char scheme_end; const char host_start; const char path_start; const char port_start; const char port_end; scheme_end = strstr(url, "://"); if (scheme_end) { scheme_end += 3; // skip "://" host_start = scheme_end; path_start = strchr(host_start, '/'); if (!path_start) { path_start = url + strlen(url); // end of string } port_start = strchr(host_start, ':'); if (port_start && port_start < path_start) { port = atoi(port_start + 1); strncpy(hostname, host_start, port_start host_start); hostname[port_start host_start] = '