Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
IPv4套接字地址结构
struct sockaddr_in
{
uint8_t sinlen;(4个字节)
sa_family_t sin_family;(4个字节)
in_port_t sin_port;(2个字节)
struct in_addr sin_addr;(4个字节)
char sin_zero[];
};
sin_len:整个sockaddr_in结构体的长度,部分Linux内核版本没有该成员
sin_family:指定该地址家族,一般设置为AF_INET(使用TCP,UDP协议)
sin_port:端口
sin_addr:IPv4的地址
sin_zero:暂不使用,一般将其设置为0 通用地址结构
struct sockaddr
{
uint8_t sin_len;(4个字节)
sa_family_t sin_family;(4个字节)
char sa_data[];
};
sin_len:整个sockaddr结构的长度
sin_family:指定该地址家族
sa_data:由sin_family决定它的形式 结论:struct sockaddr_in与struct sockaddr结构大小相同
字节序
大端字节序
--最高有效位存储与最低内存地址处,最低有效位存储于最高内存地址处 小端字节序
--最高有效位存储于最高内存地址处,最低有效位存储于最低内存地址处 主机字节序
--不同主机有不同的字节序,如x86小端字节序,,Motorola 6800为大端字节序 网络字节序
--网络字节序规定为大端字节序 字节序说明:一个int类型变量254存储在内存中,如果变量的百位存储于内存地址条上的低地址处,
个位存储于内存地址条上的高地址处(即变量存储序列和内存地址序列相反)这就是大端字节序,反之则是小端字节序。
各个主机的字节序是不同的,但是在网络中传输,必须要一个统一的字节序,这就是网络字节序。
字节序转换函数
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
说明:在上述函数中,h代表host;n代表networks;s代表short;l代表long。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <arpa/inet.h> int main(int arg, char *args[])
{
unsigned int data = 0x12345678;
char *p = (char *)&data;
printf("%x,%x,%x,%x\n", p[], p[], p[], p[]);
/*
* 对于数组而言,内存地址一定是递增的,p[0]=*(p+0);p[1]=*(p+1);
* 如果data变量的最低有效位处于p+0这个低内存地址位,说明这是小端字节序
* */
if (p[] == 0x78)
{
printf("主机是小端字节序\n");
} else
{
printf("主机是大端字节序\n");
}
//字节序转换函数
uint32_t ndata = htonl(data);
p = (char *)&ndata;
printf("%x,%x,%x,%x\n", p[], p[], p[], p[]);
if (p[] == 0x78)
{
printf("网络字节序是小端字节序\n");
} else
{
printf("网络字节序是大端字节序\n");
}
return ;
}
地址转换函数
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
}; int inet_aton(const char *p,struct in_addr *inp);
将点分十进制(192.168.1.116)转化成struct in_addr in_addr_t inet_addr(const char * cp);
将点分十进制转化成32bit char *inet_ntoa(struct in_addr in);//注意:这里参数是结构体变量,而非结构体指针
将struct结构体变量转化成点分十进制
inet_ntoa()返回值是char *,这个char *的内存空间是在inet_ntoa()函数中静态分配的,因此inet_ntoa()后面的调用会覆盖上一次调用,inet_ntoa()是线程不安全函数。
套接字类型
.流式套接字(SOCK_STREAM)
--提供面向连接的,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。
.数据报式套接字(SOCK_DGRAM)
--提供无连接服务,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
.原始套接字(SOCK_RAW)
Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)的更多相关文章
- 【转】Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备
原文:https://www.cnblogs.com/bakari/p/10449664.html -------------------------------------------------- ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践
TCP和UDP的区别 TCP是一个面向连接的.可靠的.基于字节流的传输层协议. 而UDP是一个面向无连接的传输层协议. 具体来分析,和 UDP 相比,TCP 有三大核心特性: 面向连接:所谓的连接,指 ...
- 【UNIX网络编程(一)】套接字地址结构、网络字节顺序和地址转换功能
介绍:应该用在网络编程实现每个套接字地址结构.所以主套接字地址结构后前提网络计划编制,地址结构可以在两个方向上发送:从工艺到内核和内核处理.构中的二进制值之间进行转换. 大多数套接字函数都须要一个指向 ...
- socket编程相关的结构体和字节序转换、IP、PORT转换函数
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- Linux 网络编程详解九
TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- Linux 网络编程详解二(socket创建流程、多进程版)
netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...
随机推荐
- vs2015密钥 企业版 专业版 (vs.net)
专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- js:插入节点appendChild insertBefore使用方法
首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在 ...
- python 读写文件
#! -*- encoding:utf-8 -*- import os from config import * from function import GetCsspToken, RegistIn ...
- BIEE11G常用函数及使用说明
BIEE常用函数使用手册 1.AGGREGATE AT 此函数根据指定的级别聚合列.使用AGGREGATE AT 可确保始终在关键字AT 之后指定的级别执行度量聚合,而无论WHERE 子句如何. 语法 ...
- mysql 5.5多实例部署【图解】
mysql5.5数据库多实例部署,我们可以分以下几个步骤来完成. 1. mysql多实例的原理 2. mysql多实例的特点 3. mysql多实例应用场景 4. mysql5.5多实例部署方法 一. ...
- Dubbo 分布式服务框架(spring、zookeeper)
DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架, alibaba资源 源码:https://github.com ...
- HTTPS那些事(二)SSL证书
转自:http://www.guokr.com/post/116169/ 从第一部分HTTPS原理中, 我们可以了解到HTTPS核心的一个部分是数据传输之前的握手,握手过程中确定了数据加密的密码.在握 ...
- od
$od [-t type]查看非文本文件 a 使用默认字符输出 c 使用ASC II字符输出 d[size] 使用十进制来输出数据,每个整数占用size byte o ..八 x ..十六 f ..浮 ...
- PHP读取超大文件的实例代码
数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机 去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一 ...
- [To be translated] Nova:libvirt image 的生命周期
翻译自:http://www.pixelbeat.org/docs/openstack_libvirt_images/ The main stages of a Virtual Machine dis ...