Tag: 网络

为什么inet_ntoa和inet_ntop“反转”字节?

这是一个相当基本的问题,令我惊讶的是,我今天遇到了一个问题。 它看起来像inet_pton和inet_ntoa正在反转他们给出的IP地址的字节: DWORD IP; inet_pton(AF_INET, “192.168.0.1”, &IP); printf(“%08X\n”, IP); 这将打印0100A8C0 。 好吧,如果我们分解字节,它是01.00.A8.C0 = 1.0.168.192 。 同理: IP = 0x7F000001; struct in_addr ia; ia.S_un.S_addr = IP; printf(“%s\n”, inet_ntoa(ia)); 给了我1.0.0.127 。 首先想到的是endianness,但我已经阅读了MSDN文档( 1和2 )并且没有提到字节顺序; 这对我来说似乎很奇怪,这些函数会随意决定使用其中一种符号而没有明确说明。 到底是怎么回事?

用Scapy与Csockets通信

我有一个UDP连接并侦听端口(localhost),我也试图从localhost发送一个Scapy数据包。 出于某种原因,我的C代码实际上从未捕获过数据包,但是我可以看到数据包在Wireshark中显示就好了。 自从我使用套接字以来已经有一段时间了,但我是否需要设置一些特殊的套接字选项,或者为什么我能够在Wireshark中看到数据包就好但不是通过C套接字? 注意:当我编写相应的套接字代码来发送数据包(来自localhost)时,我能够成功捕获数据包但是当从另一台计算机发送时,我仍然无法获取侦听数据包来捕获数据包。 我发现了一个类似的问题但是当我尝试他们的方法(使用UDP而不是TCP)时,我仍然无法使用netcat来捕获Scapy数据包。 C代码(为了清楚起见而浓缩) int main() { int sock, dataLen, inLen; struct sockaddr_in inAddr; short listen_port = 8080; char buffer[2048]; if (sock = socket(AF_INET,SOCK_DGRAM,0) < 0) { printf("ERROR: unable to establish socket\n"); return -1; } // zero out address structure memset(&inAddr, 0, sizeof(inAddr)); inAddr.sin_family = AF_INET; inAddr.sin_addr.s_addr = htonl(INADDR_ANY); inAddr.sin_port = htons(listen_port); if […]

从C访问网络数据包中未对齐数据的安全有效方法

我正在用ARM9处理器在C for Linux上编写程序。 该程序用于访问网络数据包,其中包括一系列标记数据,如: … fieldID和length字段都是uint16_t。 数据可以是1个或更多字节(如果使用全长,则最多64k,但事实并非如此)。 只要具有偶数个字节,我就不会发现问题。 但是如果我有一个1或3或5字节部分,那么下一个16位fieldID最终不会出现在16位边界上,我预计会出现对齐问题。 已经有一段时间了,因为我从头做过这样的事情,所以我对细节不太了解。 任何反馈欢迎。 谢谢。

为什么C中的某些函数有下划线前缀?

我最近开始用C语言学习网络,我看到一些函数以下划线_function()开头 – 这究竟是什么意思? 我也看到了这个: struct sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[sizeof (struct sockaddr) – __SOCKADDR_COMMON_SIZE – sizeof (in_port_t) – sizeof (struct in_addr)]; }; 这部分代码意味着什么: __SOCKADDR_COMMON (sin_); unsigned char sin_zero[sizeof (struct sockaddr) – __SOCKADDR_COMMON_SIZE – sizeof (in_port_t) – sizeof (struct in_addr)];

编写OS X内核扩展以实现Linux的SO_BINDTODEVICE套接字选项

我希望能够通过特定的网络接口强制套接字。 在Linux中,内核允许程序员通过设置所述套接字选项来实现这一点 – 但在OS X中,我处于黑暗中。 因此我的标题问题 – 是否可能? 它完成了吗? 我不打算重新实现IP堆栈,只是启用了bind-to-interface选项。

`select`来自多个线程的同一个fd

如果我从多个线程调用相同的打开文件描述符,会发生什么? 这是在某处记录的吗?

如何在没有网络的情况下通过wifi发送原始数据包?

我试图在两个覆盆子pi之间通过wifi发送一些数据,而不用它们连接到网络。 我希望它的工作方式类似于信标和探测请求的工作方式,其中广播可以从无线接口发出。 我要发送的数据将是设备的主机名和数据包发送的时间。 我一直试图在过去几天解决这个问题,但如果没有它们在同一个网络上,我就无法工作。 有人能指出我正确的方向吗? 我对于我使用的语言并不太感兴趣。 我一直在尝试使用python和C,但收效甚微。

在C中获取网页源代码的最有效方法是什么?

在PHP中,我可以这么简单: file_get_contents(‘http://stackoverflow.com/questions/ask’); C中最短的代码是什么? UPDATE 当我使用curl编译示例时,得到如下错误: unresolved external symbol __imp__curl_easy_cleanup referenced in function _main

c有效网络掩码的代码

我有没有办法检查32位网络掩码有效或不使用按位运算符? 我必须从msb侧检查’1’是否连续流。 例如11111111.0.0.0(255.0.0.0)有效但11111101.0.0.0(253.0.0.0)不有效。

struct addrinfo和struct sockaddr有什么区别

根据我的理解,struct addrinfo用于准备套接字地址结构,struct sockaddr包含套接字地址信息。 但这究竟意味着什么呢? struct addrinfo包含指向struct sockaddr的指针。 为什么要将它们分开? 为什么我们不能将sockaddr中的所有内容组合到addr_info中? 我只是在这里猜测,但他们分离的原因是为了在传递结构时节省空间? 例如,在bind()调用中,它需要的只是端口号和Internet地址。 所以这两个都分组在struct sockaddr中。 那么,我们可以传递这个小结构而不是更大的结构addrinfo? struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc. int ai_family; // AF_INET, AF_INET6, AF_UNSPEC int ai_socktype; // SOCK_STREAM, SOCK_DGRAM int ai_protocol; // use 0 for “any” size_t ai_addrlen; // size of ai_addr in bytes struct sockaddr *ai_addr; // struct sockaddr_in […]