gpt4 book ai didi

c++ - C/C++ Posix tcp/ip 网络客户端,只连接本地主机

转载 作者:行者123 更新时间:2023-11-28 07:48:07 25 4
gpt4 key购买 nike

我在 Ubuntu 12 上编写了这个简单的客户端。它是简单的 C/C++ 连接到服务器代码。它可以连接到本地主机。但是我无法让它连接到外部服务器。每次我连接到不同的主机时,它实际上连接到“本地主机”。我想这可能是我的/etc/hosts 文件的配置方式,但我不知道。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <errno.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>

int connect(const std::string host, const std::string path) {
const int port = 80;
// Setup the msock
int m_sock;
sockaddr_in m_addr;
memset(&m_addr, 0, sizeof(m_addr));
m_sock = socket(AF_INET, SOCK_STREAM, 0);

int on = 1;
if (setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(on)) == -1) {
return false;
}

// Connect //
m_addr.sin_family = AF_INET;
m_addr.sin_port = htons(port);
int status = inet_pton(AF_INET, host.c_str(), &m_addr.sin_addr);

cout << "Status After inet_pton: " << status << " # " << m_addr.sin_addr.s_addr << endl;
if (errno == EAFNOSUPPORT) {
return false;
}
status = ::connect(m_sock, (sockaddr *) &m_addr, sizeof(m_addr));
if (status == -1) {
return false;
}
} // End of the function //

在这一行:m_addr.sin_addr.s_addr

我得到零。

最佳答案

您应该首先从 DNS 服务器解析您域名的 IP 地址,然后尝试建立连接。gethostbyname 将给出从具有hostent 结构的域名解析的IP 地址列表。您可以按如下方式使用它:

struct hostent *hent;
hent = gethostbyname(host.c_str());

然后移动hostent给你的地址列表并测试连接,这里是hostent结构和gethostbyname定义:

#include <netdb.h>
struct hostent *gethostbyname(const char *name);

struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}

关于c++ - C/C++ Posix tcp/ip 网络客户端,只连接本地主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14433271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com