[英]C/C++ Posix tcp/ip network client, only connecting to localhost
我在Ubuntu 12上編寫了這個簡單的客戶端。它是簡單的C / C ++連接服務器代碼。 它可以連接到本地主機。 但是我無法連接到外部服務器。 每次我連接到其他主機時,它實際上都連接到“ localhost”。 我認為這可能是配置/ 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
會給它從與該域名解析的IP地址列表中hostent
結構。 您可以按以下方式使用它:
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 */
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.