htons

linux系统中使用socket直接发送ARP数据

折月煮酒 提交于 2020-02-24 14:42:14
这个重点是如这样创建socket: sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是原始的网络数据包。 代码如下:在X86和ARM平台上都测试通过。调用arp_scaner_init之后 ,调用send_arp来发送ARP数据包,thread_read_arp中就会收到对端的反馈,并将其保存。 在此非常感谢其他同仁的分享,使我学会了这个用法。 #include <unistd.h> #include <errno.h> #include <netdb.h> #include <signal.h> #include <sys/socket.h> #include <sys/poll.h> #include <sys/ioctl.h> #include <netinet/if_ether.h> #include <net/if_arp.h> #include <netinet/udp.h> #include <netinet/ip.h> #include <stdio.h> #include <stdarg.h> #include <net/if.h> #include <arpa/inet.h> #include <string.h> #include "adapter

socket网络编程快速上手(一)

回眸只為那壹抹淺笑 提交于 2020-01-23 05:35:18
工作以来,写了很多socket相关的代码。磕磕碰碰,走了很多弯路,也积累了一些东西,今天正好整理一下。为了证明不是从书上抄来的,逻辑会有点乱(借口,呵呵)!知识点的介绍也不会像书上说的那么详细和精准,毕竟个人水平也就这样了。当然,主要还是以上手为主,不过分剖析原理性内容。一些陌生的函数要用到的头文件,使用man查看一下就能解决了。既然该文的名称为“快速上手”,那个人认为下述内容都不存在水分,都是必须要掌握的,一点都不能急躁! 一、socket连接流程: 对于程序员来说,开始的时候只会把socket编程当成一个工具,尽快上手,尽快解决战斗。于是乎最关心的就是socket那些函数的调用顺序,那就先给出UDP/TCP的流程图(从《UNIX网络编程》)吧: 有了流程图,再找一些资料,就很容易写出下面这样的代码(以TCP为例): 服务器程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 #include <netinet/in.h> 8 #include <arpa/inet.h> 9 10 #define PORT 1234 11 #define

大小端模式转换函数

一个人想着一个人 提交于 2019-12-24 21:38:10
htonl(),htons(),ntohl(),ntons()--大小端模式转换函数 不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian)。 大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处。 小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处。 在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(也就是大端模式) 。 通过对大小端的存储原理分析可发现,对于 char 型数据,由于其只占一个字节,所以不存在这个问题,这也是一般情况下把数据缓冲区定义成 char 类型 的原因之一。对于 IP 地址、端口号等非 char 型数据,必须在数据发送到网络上之前将其转换成大端模式,在接收到数据之后再将其转换成符合接收端主机的存储模式。 Linux 系统为大小端模式的转换提供了 4 个函数,输入 man byteorder 命令可得函数原型: #include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong);

sockaddr与sockaddr_in的区别

依然范特西╮ 提交于 2019-12-23 09:46:48
本文转自: https://blog.csdn.net/will130/article/details/53326740/ struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。 一、sockaddr sockaddr在头文件 #include <sys/socket.h> 中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下: struct sockaddr { sa_family_t sin_family;//地址族    char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息    }; 二、sockaddr_in sockaddr_in在头文件 #include<netinet/in.h>或#include <arpa/inet.h> 中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中,如下: sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。 三、总结 二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。 sockaddr常用于bind、connect、recvfrom

htons 函数

独自空忆成欢 提交于 2019-12-17 05:16:37
我们常用的 x86 CPU 电脑是 little-endian,也就是整数的低位字节放在内存的低字节处。 举个例子吧。假定你的数据是0x1234, 在网络字节顺序里 这个数据放到内存中就应该显示成 addr addr+1 0x12 0x34 而在x86电脑上,数据0x1234放到内存中实际是: addr addr+1 0x34 0x12 htons 的用处就是把实际主机内存中的整数存放方式调整成网络字节顺序。 htons将主机(内存)字节顺序转成网络字节顺序 数据在内存中是按照低字节在前高字节在后的顺序存储的 网络字节顺序是按照高字节在在前低字节在后的顺序的 0x1234 在内存中 addr addr+1 0x34 0x12 网络字节顺序 addr addr+1 0x12 0x34 来源: CSDN 作者: 飞天_ 链接: https://blog.csdn.net/qq_36769722/article/details/103570024

ntohs, ntohl, htons,htonl的比较

≯℡__Kan透↙ 提交于 2019-12-07 20:44:28
最近的工作是进行程序由 SUN SPARC 向 Intel X86 移植的工作,多数问题都出现在网络字节序的部分,所以拿出来在这部分工作中使用频率较高的几个接口区分比较下:) ntohs =net to host short int 16位 htons=host to net short int 16位 ntohl =net to host long int 32位 htonl=host to net long int 32位 ntohs 简述: 将一个无符号短整形数从网络字节顺序转换为主机字节顺序。 #include u_short PASCAL FAR ntohs( u_short netshort); netshort:一个以网络字节顺序表达的16位数。 注释: 本函数将一个16位数由网络字节顺序转换为主机字节顺序。 返回值:ntohs()返回一个以主机字节顺序表达的数。 htons 简述: 将主机的无符号短整形数转换成网络字节顺序。 #include u_short PASCAL FAR htons( u_short hostshort); hostshort:主机字节顺序表达的16位数。 注释: 本函数将一个16位数从主机字节顺序转换成网络字节顺序。 返回值: htons()返回一个网络字节顺序的值。 ===================================

系统平台大小端问题

守給你的承諾、 提交于 2019-12-07 11:08:48
Internet上的数据以 大端方式 在网络上传输!!! 常见CPU及大小端 CPU 操作系统 字节顺序 x86 (Intel、AMD等) 所有 little-endian DEC Alpha 所有 little-endian HP-PA NT little-endian HP-PA UNIX big-endian SUN SPARC 所有 big-endian MIPS NT little-endian MIPS UNIX big-endian PowerPC NT little-endian PowerPC 非NT big-endian RS/6000 UNIX big-endian Motorola m68k 所有 big-endian Socket编程中经常采用第二种方法。整个传输过程如下: 发送端将本机的数据转换成网络的字节顺序(调用API函数htonl或 htons ),然后发送;接收端收到网络数据后,先将数据转换成本机的字节顺序(调用API函数ntohl或 ntohs ),然后再进行其它操作——如此就能保证“会议精神”在通信双方的正确传达了! 这个过程中用到的几个API函数:ntohl、htonl、 ntohs 、 htons ,名字都差不多,很难区分。但是如果知道了它们的来历,问题也就不存在了:n是network,网络的意思;h是host,本地主机的意思。

socket编程为什么需要htonl(), ntohl(), ntohs(),htons() 函数-------转载

匿名 (未验证) 提交于 2019-12-03 00:39:02
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数。 网络字节顺序与本地字节顺序之间的转换函数: htonl()--"Host to Network Long" ntohl()--"Network to Host Long" htons()--"Host to Network Short" ntohs()--"Network to Host Short"   之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO 网络字节顺序NBO(Network Byte Order): 主机字节顺序(HBO,Host Byte Order):    int main() { printf("%d \n",htons(16)); return 0; }   得到的结果是4096,初一看感觉很怪。 包含的头文件为:"winsock2.h"   原文地址: http://blog.chinaunix.net/uid-21278406-id-444362.html 原文:https://www.cnblogs.com/6-6-8-8/p/9264944.html

MFC socket编程(二)

匿名 (未验证) 提交于 2019-12-02 23:43:01
一、大端、小端法定义 1.1小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。 (主机字节顺序) 1.2 大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。(网络字节顺序) 举个简单的例子,对于整形0x12345678。它在大端法和小端法的系统内中,分别如图所示的方式存放。 二、字节顺序转换 Windows Sockets 的htons函数将把一个u_short类型的值从主机字节顺序转换为TCP/IP网络字节顺序,函数原型如下: u_short htons(u_short hostshort); 参数: l hostshort:一个以主机字节顺序表示的16位数。 与htons函数相类似的还有一个函数htonl,该函数将把一个u_long类型的值从主机字节顺序转换为TCP/IP网络字节顺序,函数原型如下: u_long htonl(u_long hostlong); 参数: l hostlong:一个以主机字节顺序表示的32位数。 转载请标明出处: MFC socket编程(二) 文章来源: MFC socket编程(二)

ARP输入 之 arp_process

余生颓废 提交于 2019-12-02 16:42:54
概述 arp_process为ARP输入包的核心处理流程; 若输入为ARP请求且查路由成功,则进行如下判断:输入到本地,则进行应答;否则,允许转发,则转发,本文代码不包含转发流程; 若输入为ARP应答或者查路由失败,则更新邻居项; 源码分析 1 static int arp_process(struct net *net, struct sock *sk, struct sk_buff *skb) 2 { 3 struct net_device *dev = skb->dev; 4 struct in_device *in_dev = __in_dev_get_rcu(dev); 5 struct arphdr *arp; 6 unsigned char *arp_ptr; 7 struct rtable *rt; 8 unsigned char *sha; 9 unsigned char *tha = NULL; 10 __be32 sip, tip; 11 u16 dev_type = dev->type; 12 int addr_type; 13 struct neighbour *n; 14 struct dst_entry *reply_dst = NULL; 15 bool is_garp = false; 16 17 /* arp_rcv below verifies