在包括Beej指南在内的所有示例中,IP地址都是以点表示法提供的,然后提供给::getaddrinfo()
。这个职位不回答我的问题。
之后,addrinfo
结构用于与套接字相关的函数(例如connect()
、bind()
、listen()
)。例如:
struct addrinfo hints, *res;
// ... create socket etc.
connect(sockfd, res->ai_addr, res->ai_addrlen);
示例
变量ai_addr
的类型为sockaddr
,可以安全地向sockaddr_storage
、sockaddr_in
和sockaddr_in6
输入。
问题:
如果我将sockaddr
类型为sockaddr_in
(或sockaddr_in6
)
sockaddr_in& ipv4 = (sockaddr_in&)(sockaddr_variable);
并提供以下信息:
我可以直接使用上面的信息调用connect()
方法吗?
connect(sockfd, &ipv4, sizeof(ipv4));
用我的程序,它似乎不起作用。我是错过了什么,还是有更好的方法?
其背后的动机是,如果我们以套接字可读的格式获得IPAddress、端口等信息,那么为什么要经历getaddrinfo()
的循环?
发布于 2014-08-09 16:41:56
请确保将您的值按网络顺序排列,下面是一个小示例:
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in server;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
printf("Could not create socket\n");
}
printf("Socket created\n");
server.sin_family = AF_INET;
// 173.194.32.207 is a google address
server.sin_addr.s_addr = 173 | 194 << 8 | 32 << 16 | 207 << 24;
server.sin_port = 0x5000; // port 80
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
{
perror("connect failed. Error");
return 1;
}
printf("Connected\n");
close(sock);
return 0;
}
发布于 2014-08-09 17:20:01
首先,检查机器是否可访问&服务器应用程序正在使用"netstat“实用程序在机器上运行。使用inet_aton方法将虚位地址转换为网络字节顺序。最后,记录连接返回的错误值,以获得故障的确切原因。
发布于 2014-08-09 17:39:42
值得注意的是,调用socket::{connect, bind, ...}
是错误的:这些是C API
s,C没有名称空间、类等等。
您应该使用getaddrinfo
,因为使用它更容易,也更安全。但是,没有什么可以阻止您使用struct sockaddr
及其所有变体。实际上,getaddrinfo
是一种包装器,如man(3) getaddrinfo
中所述。
getaddrinfo()函数将gethostbyname(3)和getservbyname(3)函数提供的功能组合到一个接口中,但与后面的函数不同,getaddrinfo()是可重入的,允许程序消除IPv6 4与IPv6 6的依赖关系。
举个例子:
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
inet_pton(addr.sin_family, "198.252.206.16", &addr.sin_addr);
int fd = socket(addr.sin_family, SOCK_STREAM, 0);
if (fd == -1)
; /* could not create socket */
if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
; /* could not connect */
close(fd);
}
https://stackoverflow.com/questions/25220512
复制相似问题