- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试创建一个套接字并连接到远程主机。我使用 GetAddrInfo 从域解析远程主机。哪个工作正常。通话后,我得到一个具有正确值的工作地址信息结构。但在某些情况下,结构在调用 connect() 之前会损坏。
struct addrinfoW sa = { 0 };
ZeroMemory(&sa, sizeof(sa));
lookup_host(host, &sa);
int sock = 0;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1) {
return -1;
}
HeapValidate(GetProcessHeap(), HEAP_NO_SERIALIZE, NULL);
if(connect(sock, sa->ai_addr, sa->ai_addrlen) < 0) {
HeapValidate(GetProcessHeap(), HEAP_NO_SERIALIZE, NULL);
#ifdef _DEBUG
printf("Error: %d\n", GetLastError());
#endif // _DEBUG
return -2;
}
其中 lookup_host 定义为:
struct addrinfoW hints = { 0 };
struct addrinfoW *res;
int errcode;
ZeroMemory(&hints, sizeof(struct addrinfoW));
//ZeroMemory(res, sizeof(struct addrinfo));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_CANONNAME;
errcode = GetAddrInfo(host, L"80", &hints, &res);//GetAddrInfoExW(L"google.de", L"80", NS_ALL, NULL, &hints, &res, NULL, NULL, NULL, NULL); //GetAddrInfoEX(L"google.de", L"80", &hints, &res);
win_free(mbHost);
if (errcode != 0)
{
//perror("getaddrinfo");
return -1;
}
void *ptr = 0;
while (res)
{
switch (res->ai_family)
{
case AF_INET:
ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
break;
case AF_INET6:
ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
break;
}
CopyMemory(out, res, sizeof(struct addrinfoW));
break;
res = res->ai_next;
}
FreeAddrInfo(res);
所以这在我的四核 Win10 笔记本电脑上运行良好。但是如果我添加例如一个
MessageBoxA(NULL, "After sock", "HTTP", MB_ICONWARNING|MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);
在 connect() 调用之前调用并在调试器中检查它损坏的 addrinfo 结构。例如,有时我可以看到应该是“google.com”的 ai_canonname 被“After Sock”覆盖了。但是堆在那之后仍然有效。所以我不知道从哪里开始调试这个。可能是其他缓冲区或结构在某处溢出了吗?
最佳答案
这是因为您在使用结果之前释放了与结果相关的所有内存。例如,ai_canonname
是指向从堆中分配的字符串的指针。在您退出 lookup_host
之前,包含其字节的内存被标记为可用以供重用。您的 CopyMemory
将复制指针而不是它指向的字节。
注意,您应该发布整个 lookup_host
,包括函数定义。
在完成之前,您需要找到一种避免调用 FreeAddrInfo
的方法。或者做一个更深层次的 struct
副本,包括所有被指向的东西,你会发现它们很快变成了一个兔子洞。
我的做法是提供一个在 lookup_host
内部调用的回调函数
关于C addrinfo 结构损坏。但是堆仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53300622/
C - addrinfo - 指针段错误 我遇到了段错误;我做了一个奇怪的修复,但我仍然很担心,因为我无法弄清楚问题出在哪里。任何见解都将是惊人的!在最后一个代码块中进行“修复”! 尝试使用 targ
我正在用 C 编写一个简单的网络程序。当我使用 --std=c11 打开 -Wall 时,我收到一条关于声明方式的错误消息一个结构。 #include #include #include int
我正在读Beejs' Guide to Network Programming 我在理解链表的目的(即此结构中的最终参数)时遇到困难: struct addrinfo { int
我想查询特定的服务器,并以与我们通过 getaddrinfo 获取结果相同的方式获取结果。我想要一个addrinfo struct,这样我就可以获得 ip、端口和指向下一个结果的指针。 我正在使用下面
我需要处理两个结构 addrinfo指针。由于我使用 C++(11) 进行编码,因此我必须使我的代码异常安全。确实,我的 costructors 可能会抛出 runtime_error . 当你不再需
我刚开始在 C 中使用 UDP 套接字,我有一个与内存管理相关的问题。通常示例显示以下内容 struct addrinfo *result; //to store results struct
我尝试创建一个套接字并连接到远程主机。我使用 GetAddrInfo 从域解析远程主机。哪个工作正常。通话后,我得到一个具有正确值的工作地址信息结构。但在某些情况下,结构在调用 connect() 之
我想使用如下共享内存将 getaddrinfo 结构 (*res) 的输出传递到父(从子)进程 pid = fork(); if (pid == 0) { ..... iStatus
至少我有点困惑。getaddrinfo() 调用 'updates' 指向 addrinfo 结构的指针,当我要在同一范围(该函数)中使用 addrinfo 时一切都很好,但是如果我将结构复制到另一个
我的 addrinfo 指针看起来像这样 - struct addrinfo hint, *res = NULL; 然后我调用 get addrinfo。 hint.ai_family = AF_UN
void ClientCreate(struct addrinfo * addr, const char* port) { sockaddr_in servic
我正在将 eclipse 与 cygwin 结合使用。该应用程序是 64 位的。在 cygwin 中,结构定义为: struct addrinfo { int ai_fla
我正在尝试使用 unique_ptr 处理 winsock 的 addrinfo 指针。在做了一些研究之后,我发现了一个没有很好解释的答案,所以现在我很困惑。 (我说的答案:Smart pointer
如有任何帮助,我们将不胜感激。我正在开发一个 udp 连接,我有一个初始化地址参数的函数。这是代码 void Socket::InitAddrInfoStruct (struct addrinfo *
我开始学习C/C++网络编程,却卡在了起点。我在编程方面有点菜鸟,但我了解基本的东西,如 C 库、指针、结构等。我找不到关于与 addrinfo/sockaddr_in 结构相关的一些细节的详细解释信
我已经用数据填充了我的结构struct addrinfo **res: err = getaddrinfo(argv[1], NULL, &hints, &res); 如果我想打印IP地址,我可以使用
我正在编写一个程序,可以连接到不同的网站并请求和下载网页。我这样做在很大程度上是为了学习和正确理解网络编程。我想知道 getaddrinfo 返回的指向类型为 struct addrinfo 的链表的
我有一个 struct sockaddr 并且需要制作一个 struct addrinfo(特别是那个,因为这是其他一些 API 想要的)。 IP 地址可以是 IPv4 或 IPv6。处理该问题的最佳
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我正在自学套接字编程,最近遇到了 getaddrinfo 和 addrinfo 结构。据我了解,结构中的大部分文件都是整数,您可以通过指定宏来使用它们,例如,如果我想在我的 addrinfo 结构中使
我是一名优秀的程序员,十分优秀!