0

私はこの単純なクライアントを 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

私はゼロになります。

4

1 に答える 1

1

最初に 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 */
}
于 2013-01-21T06:46:09.563 に答える