首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gethostbyname的访问冲突之谜?

问gethostbyname的访问冲突之谜?
EN

Stack Overflow用户
提问于 2013-03-12 12:59:59
回答 2查看 597关注 0票数 1
代码语言:javascript
复制
std::cout << WebClient().Load(in.substr(2, in.length()));

我做了一个WebClient,有趣的是,你可以通过cin传入一个字符串,然后通过std::getline(cin,in )传入;

我的Load方法的开始部分:

代码语言:javascript
复制
std::string Load(std::string url)
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        return "WSAStartup failed.\n";
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    host = gethostbyname(url.c_str());
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    if(host != nullptr)
    {
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    }

我会遇到访问冲突,因为主机变成了nullptr (因此要检查它),但是使用相同的字符串,但传入的方式不同: WebClient().Load("www.google.ca")它可以工作。我试着将c_str()放在子字符串的末尾,但没有用。

我还在学习这些怪癖,这是怎么回事?我使用的是来自

代码语言:javascript
复制
#include <http.h>
#include <string>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 15:05:25

写我的评论作为回答:你应该打印URL的方式,让你看到是否有额外的字符,甚至空格。然后你应该检查你使用的所有函数的错误代码,就像在这里阅读the documentation of gethostbyname。下面是您的函数的调试版本,使用该版本,您需要error codes explained here

代码语言:javascript
复制
#include <cstring>

std::string Load(std::string url)
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        return "WSAStartup failed.\n";
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    std::cout << "Getting hostname for url as seen by gethostbyname: '" << url.c_str() << "', strlen=" << strlen(url.c_str()) << std::endl;
    host = gethostbyname(url.c_str());
    if (host) {
        std::cout << "got valid hostent as response" << std::endl;
    } else {
        std::cout << "gethostbyname WSAGetLastError=" << WSAGetLastError() << std::endl;
        return "Invalid url.\n";
    }
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    if(host != nullptr)
    {
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    }

猜猜原因:来自cin的url中有空格。

关于术语的说明:地址字符串,它不是真正的url,url必须在开始时具有类似于http://的方案。您所拥有的是主机的完全限定域名,因为它也应该是完全限定的,gethostbyname不理解urls。

票数 1
EN

Stack Overflow用户

发布于 2013-03-12 13:07:34

尝试检查从getline接收到的传入字符串的值。当gethostbyname接收到它时,它可能是畸形的。您可以使用WSAGetLastError来检查这是否是它失败(并变为NULL)的地方。检查MSDN中是否有gethostbyname可能的error codes。

编辑:你说你有看似相同的参数。你能找到一种(对你自己)证明这一点的方法吗?也许里面有隐形的角色?一个新的行\n,或者它可能使用了不同的编码?只是一些想法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15353651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档