std::cout << WebClient().Load(in.substr(2, in.length()));我做了一个WebClient,有趣的是,你可以通过cin传入一个字符串,然后通过std::getline(cin,in )传入;
我的Load方法的开始部分:
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()放在子字符串的末尾,但没有用。
我还在学习这些怪癖,这是怎么回事?我使用的是来自
#include <http.h>
#include <string>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")发布于 2013-03-12 15:05:25
写我的评论作为回答:你应该打印URL的方式,让你看到是否有额外的字符,甚至空格。然后你应该检查你使用的所有函数的错误代码,就像在这里阅读the documentation of gethostbyname。下面是您的函数的调试版本,使用该版本,您需要error codes explained here
#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。
发布于 2013-03-12 13:07:34
尝试检查从getline接收到的传入字符串的值。当gethostbyname接收到它时,它可能是畸形的。您可以使用WSAGetLastError来检查这是否是它失败(并变为NULL)的地方。检查MSDN中是否有gethostbyname可能的error codes。
编辑:你说你有看似相同的参数。你能找到一种(对你自己)证明这一点的方法吗?也许里面有隐形的角色?一个新的行\n,或者它可能使用了不同的编码?只是一些想法。
https://stackoverflow.com/questions/15353651
复制相似问题