- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试修改 Linux tracepath (traceroute) 程序以使其处理三个不同的 ip 地址。这三个 ip 地址是:
应该将它们转换为套接字地址结构和无符号整数值等,然后再转换回字符串,但我一直遇到段错误。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/errqueue.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
//#include <resolv.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <arpa/inet.h>
#include <getopt.h>
char target_ip_string[INET_ADDRSTRLEN] = {0}; // first address written out string
char alternate_ip_1[INET_ADDRSTRLEN] = {0}; // second address written out string
char alternate_ip_2[INET_ADDRSTRLEN] = {0}; // third address written out string
struct sockaddr_in target_host; // first address
struct sockaddr_in target_alt1; // second address
struct sockaddr_in target_alt2; // third address
/**
* This example should convert three distict ip addresses from three distinct
* strings to three distinct integer values.
*/
int
main(int argc, char **argv) {
setvbuf(stdout, NULL, _IONBF, 0); // auto flushing.
struct hostent *hostname_target_entry;
struct hostent *hostname_alt1_entry;
struct hostent *hostname_alt2_entry;
target_host.sin_family = AF_INET;
target_alt1.sin_family = AF_INET;
target_alt2.sin_family = AF_INET;
char * target_hostname = (char *) "11.11.11.11";
char * alternate_ip_1_local = (char *) "144.133.133.133";
char * alternate_ip_2_local = (char *) "202.202.202.202";
printf("The first ip is: %s \n", target_hostname);
printf("The second ip is: %s \n", alternate_ip_1_local);
printf("The third ip is: %s \n\n", alternate_ip_2_local);
hostname_target_entry = gethostbyname(target_hostname);
hostname_alt1_entry = gethostbyname(alternate_ip_1_local);
hostname_alt2_entry = gethostbyname(alternate_ip_2_local);
memcpy(&target_host.sin_addr, hostname_target_entry->h_addr_list[0], 4);
memcpy(&target_alt1.sin_addr, hostname_alt1_entry->h_addr_list[0], 4);
memcpy(&target_alt2.sin_addr, hostname_alt2_entry->h_addr_list[0], 4);
// These should be three different ip addresses
printf("First ip as an integer: %u \n", target_host.sin_addr.s_addr); // Why are these all the same?
printf("Second ip as an integer: %u \n", target_alt1.sin_addr.s_addr); // Why are these all the same?
printf("Third ip as an integer: %u \n\n", target_alt2.sin_addr.s_addr); // Why are these all the same?
printf("No seg fault yet. \n\n");
// This conversion should yield "11.11.11.11"
const char * conversion1 = inet_ntop(AF_INET, &(target_host.sin_addr), target_ip_string, INET_ADDRSTRLEN);
printf("Result of inet_ntop: %s \n", conversion1); // Why is this "202.202.202.202" and not "11.11.11.11"?
printf("Seg fault here. \n\n");
// This conversion should yield "144.133.133.133".
const char * conversion2 = inet_ntop(AF_INET, &(target_alt1.sin_addr), alternate_ip_1, INET_ADDRSTRLEN);
// This conversion should yield "202.202.202.202".
const char * conversion3 = inet_ntop(AF_INET, &(target_alt2.sin_addr), alternate_ip_2, INET_ADDRSTRLEN);
return 0;
}
终端输出:
The first ip is: 11.11.11.11
The second ip is: 144.133.133.133
The third ip is: 202.202.202.202
First ip as an integer: 3402287818
Second ip as an integer: 3402287818
Third ip as an integer: 3402287818
No seg fault yet.
Result of inet_ntop: 202.202.202.202
Seg fault here.
为什么我在 string 和 hostent/sockaddr_in 之间的转换总是失败?
最佳答案
gethostbyname
函数返回一个指向静态数据的指针,因此如果您不复制给定调用的结果,它将被下一次调用覆盖。
由于您只转换 IP 地址而不转换主机名,因此最好改用 inet_addr
:
target_host.sin_addr.s_addr = inet_addr("11.11.11.11");
target_alt1.sin_addr.s_addr = inet_addr("144.133.133.133");
target_alt2.sin_addr.s_addr = inet_addr("202.202.202.202");
关于C gethostbyname 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429682/
gethostbyname 在执行 gethostbyname("www.google.com") 时有效,但执行如下操作时: char *name = "www.google.com"; get
我刚刚开始使用 C 进行编程。这应该是一个简单的程序,但我遇到了段错误。我将不胜感激任何帮助 问候, 胡安 #include #include #include #include #includ
我不明白错误信息。我试图做的是在将 mpich2 版本 1.4 或 1.5 安装到 /opt/mpich2 后运行 MPICH2 应用程序(两个版本都失败并出现相同的错误)。我的 MPI 应用程序是用
我研究了 GHOST 或 CVE-2015-0235 漏洞。我发现我的系统很脆弱。我写了一个测试程序来看看效果。但我什么也看不见。听到的是我的尝试: user@debian:~$ uname
当我必须向服务器发送套接字时,我正在用 C 语言编写第一个客户端。当我尝试获取它的地址时,我得到一个 Resource temporarily unavailable 我找不到导致此问题的原因。 da
我正在尝试从给定域接收 IP 地址。域名从客户端发送到本地服务器,在服务器中我需要找到 IP。 这是我的代码: int hostname_to_ip(char * hostname, char* ip
我正在用 C 语言编写一个基本的代理服务器。 我正在使用firefox进行测试,并且我已经让服务器成功接收了浏览器的请求。 但现在我需要将它们发送到互联网以获取浏览器想要的页面,而我很犹豫。 这是我目
这段代码第一次进入循环时运行完美,第二次给出 get seg 错误,如果我运行程序..退出..再次运行,它运行完美也是 if ((server=gethostbyname(HOSTA))==NULL)
我正在尝试查找源的 IP,但它不起作用。 void getSourceIp(struct hostent *sourceHost, struct ip *ipStruct) { char so
我正在尝试修改 Linux tracepath (traceroute) 程序以使其处理三个不同的 ip 地址。这三个 ip 地址是: "11.11.11.11"; "144.133.133.133"
我希望在我的 Suse m/c 中使用“gethostbyname”,但它没有返回任何结构。 但在其他系统上它工作正常我的 m/c 可能有什么问题?? 最佳答案 请注意,新的实现方式是使用 getad
我正在以通常的方式使用 gethostbyname() 函数... iaHost.s_addr = inet_addr(lpServerName); if (iaHost.s_addr == INAD
当我在没有联网的NDK应用程序中调用gethostbyname时,我打开wifi开关,用同一个主机再次调用gethostbyname,仍然失败,h_errno = 2。 这是为什么以及如何避免。 最佳
#include #include #include #include int main(int argc, char** argv) { char *ptr, **pptr;
我正在编写一个程序来检查给定 url 或 ip 上的端口是否打开。为了获得给定 url 的 ip 地址,我使用了 gethostbyname()。当尝试查找本地主机的地址时,它会返回正确的值,但是,尝
我是 Internet 编程的新手,我正在尝试使用 gethostbyname() 函数。当我向 gethostbyname 函数输入诸如“www.yahoo.com”的字符串时,它工作正常,但是当我
有什么方法可以防止gethostbyname()函数在Linux上不读取nscd缓存吗? 最佳答案 在 gethostbyname() 之前调用 res_init()。好像还可以。 关于c++ - 强
我正在使用 gethostbyname() 获取应用程序中域的 IP 地址。 在某些情况下,还会检查无效地址,例如“50.9.49”。 echo gethostbyname('50.9.49'); /
我不能使用 gethostbyname 来获取主机的 IP 地址,这是一个已弃用的函数,在 Windows 上只用了 10% 的时间! 我无法通过其他方法找到任何足够的资源来使用其他函数查找主机的 I
网上查了dns gethostbyname改成gethostentry,修改了代码,为什么还是不能显示正常的ipv4地址?这是我的代码: string GetHostIP() {
我是一名优秀的程序员,十分优秀!