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 < ...
随机推荐
- VisualSVN Server的配置和使用方法 图文
转载 http://www.jb51.net/article/17365.htm VisualSVN Server是免费的,而VisualSVN是收费的.VisualSVN是SVN的客户端,和Visu ...
- 谈谈vertical-align的text-bottom和text-top - 韦奕
学习资料 : http://www.tuicool.com/articles/uuYvMv 友情链接 行高 替换元素,非替换元素,内联元素,块元素
- xxx is not in the sudoers file.This incident will be reported.的解决方法 (一般用户不能执行sudo)
1.切换到root用户下 2.添加sudo文件的写权限,命令是:chmod u+w /etc/sudoers 3.编辑sudoers文件vi /etc/sudoers找到这行 root ALL=(AL ...
- Javascript 优化项目代码技巧之语言基础(一)
Javascript的弱类型以及函数作用域等规则使用编写Javascript代码极为容易,但是编写可维护.高质量的代码却变得十分困难,这个系列的文章将总结在项目开发过程中,能够改善代码可读性. ...
- git 本地库推送远程库 版本冲突的解决方法
参考: http://blog.csdn.net/shiren1118/article/details/7761203 github上的版本和本地版本冲突的解决方法 $ git push XXX ma ...
- JavaScript(七)——视频插入
代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- [MySQL Reference Manual] 5 MySQL 服务管理
5. MySQL 服务管理 5. MySQL 服务管理 5.1 The Mysql Server 5.2 Mysql 服务日志 5.2.1 选择General query log和slow query ...
- Druid 介绍及配置
1. Druid是什么? Druid是Java语言中最好的数据库连接池.Druid能够提供强大的监控和扩展功能. 2. 在哪里下载druid 正式版本下载:maven中央仓库: http://cent ...
- C# 和 C++ 数据类型对照表
又要用C#调用C++写好的api函数,为了方便,将网上的数据类型做个整理,方便以后查找,以后遇到需要的在进行查找 C++ C# WORD ushort DWORD ui ...
- C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅰ部分
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...