我的目标是成功调用C中的函数inet_pton
。
我使用的是Windows 7.到目前为止,我了解到inet_pton
有3个参数。此外,它的工作是将人类IP表示转换为计算机的二进制表示。
详细介绍了我对inet_pton(a,b,c)
的论点的理解:
a
:一个address_family。例如AF_INET
b
:指向IP地址的人类可读表示的指针(例如“127.0.0.1”)。
c
:指向存储已翻译的IP地址(二进制形式)的“事物”的指针。
在我读过的教程中,据说inet_pton
将存储数组c内的翻译指向。
此页
https://msdn.microsoft.com/de-de/library/windows/desktop/cc805844(v=vs.85).aspx
告诉我,第三个参数的类型为PVOID
。
INT WSAAPI inet_pton(__in INT Family,__in PCTSTR pszAddrString,__out PVOID pAddrBuf);
在我看来,接收数组应该是一个char数组。但PVOID
不等于char。
我的最后一个想法是涉及演员,虽然我只熟悉像
buffer = (char*) malloc (i+1);
目前我的代码看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
#include <windows.h>
#include <Winsock2.h>
#include <Ws2tcpip.h>
int main(int argc, char *argv[])
{
char *ptr2="127.0.0.1";
char buffe[512];
PVOID *ptr3;
PVOID ptr3=&buffe;
inet_pton(AF_INET,ptr2,ptr3);
system("PAUSE");
return 0;
}
如何正确初始化第三个参数(如果有必要)?如何处理存储IP地址的二进制表示的数组应该具有 char 类型而指针应该具有类型PVOID
的事实?
我的编译器抱怨ptr3的冲突类型。 非常感谢你的帮助。
答案 0 :(得分:1)
PVOID
是void *
的 typedef ,这意味着第三个参数需要通用指针。 PCTSTR
最终 typedef 编辑为const char *
(如果未定义UNICODE
)或const wchar_t *
(如果已定义UNICODE
) 。有关这些特定类型的详细信息,请参阅Windows Data Types。
您可以直接使用它所需的数据类型:IN_ADDR,而不是试图计算使用malloc()
(提示:sizeof(IN_ADDR)
)分配的字节数。根据{{3}},当第一个参数pAddrBuf
为IN_ADDR
时,第三个参数Family
必须足够大以容纳AF_INET
。
尝试做这样的事情:
#include <WinDef.h>
#include <Winsock2.h>
#include <Ws2tcpip.h>
int main(int argc, char *argv[]) {
char ip_string[] = "127.0.0.1";
IN_ADDR ip_value;
inet_pton(AF_INET, ip_string, &ip_value);
system("PAUSE");
return 0;
}