尝试获取一个程序以返回IP地址和端口号,以便我可以创建有效的TCP Client / Server程序。目前正在与函数getaddrinfo()进行斗争,并了解函数中的第二个参数是指定端口号的原因。我可以获取返回IP的信息,但无法获取返回端口号的信息。我正在以字符串形式输入主机名和端口名称(例如http或telnet),并尝试获取与之关联的IP地址和端口号。
我尝试将AI_NUMERICSERV输入到ai.flags中,以便除了指定“ http”和“ telnet”之外还输入端口号的数值。只是第一次尝试了解网络编程。
int main(int argc, char **argv){
struct addrinfo hints, *res, *p;
int status;
char ipstr[INET_ADDRSTRLEN];
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
// hints.ai_flags = AI_NUMERICSERV;//leaving this off for now
if((status = getaddrinfo(argv[1], argv[2], &hints, &res)) != 0)
{
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
return 2;
}
`for(p = res; p != NULL; p = p->ai_next)
{
void *addr;
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
printf("%s\n", ipstr);
}
printf("IP addresses for %s:\n\n", argv[1]); //displays IP correctly
printf("Port for %s: ", argv[2]); // doesn't display port number
freeaddrinfo(res);
return 0;
}
我一直期望在IP地址输出旁边输出一个端口号,但是我总是只得到IP地址而不是端口号。
答案 0 :(得分:0)
您需要读取res->ai_addr
返回的端口...
printf("port=%h\n", ntohs(((struct sockaddr_in*)(res->ai_addr)) ->sin_port));
如果您只是想弄清楚与特定服务相关的端口,并且您在* nix主机上,则也可以使用grep /etc/services
。