socket套接字(字节序、地址转换)
什么是socket:
socket可以看成是用户进程与内核网络协议栈的编程接口。
socket不仅可以用于本机的进程间通信,还可以用于网络上
不同主机之间的进程通信。
IPv4套接口地址结构
struct sockaddr_in{
uint8_t sin_len; //整个sockaddr_in结构体的长度
sa_family_t sin_family; //指定地址家族(不仅可用于tcp ip也可用于UNIX域协议)。AF_INET(ipv4)
in_port_t sin_port; //16位端口
struct in_addr sin_addr; //32位地址
char sin_zero[8]; //保留字段
}
struct in_addr{
in_addr_t s_addr; //无符号32位整数
}

1、网络字节序:规定为大端字节序。主机可能是大端字节序也可能小端字节序
2、大端字节序:高位存放于低内存,低位存放于高内存
3、小端字节序:高位存放于高内存,低位存放于低内存
主机字节序---->网络字节序------>主机字节序
下面是一个测试主机字节序的程序
#include <stdio.h>
int main(void)
{
unsigned int x=0x12345678;
unsigned char *p=(unsigned char *)&x;
printf("%0x,%0x,%0x,%0x\n",p[0],p[1],p[2],p[3]);//低地址放低位78.小端字节序
return 0;
}
字节序转换函数:
1、uint32_t htonl(unit32_t hostlong); //32位主机字节序转换为网络字节序
2、uint16_t htons(uint16_t hostshort); //16位主机字节序转换为网络字节序
3、uint32_t ntohl(uint32_t netlong); //32位网络字节序转换成主机字节序
4、uint16_t ntohs(uint16_t netlong); //16位网络字节序转换成主机字节序
h:host n:network s:short l:long(int)
#include <stdio.h>
#include<arpa/inet.h>
int main(void)
{ unsigned int x=0x12345678;
unsigned char *p=(unsigned char *)&x;
printf("%0x,%0x,%0x,%0x\n",p[0],p[1],p[2],p[3]);//低地址放低位78.小端字节序 unsigned int y=htonl(x);
p=(unsigned char *)&y;
printf("%0x,%0x,%0x,%0x\n",p[0],p[1],p[2],p[3]);//网络字节序(大端)
return 0;
}
地址转换函数:
1、in_addr_t inet_addr(const char*cp); //点分十进制的地址(192.168.0.100)转换成32位整数(网络字节序)
2、char * inet_ntoa(struct in_addr in); //网络字节序地址结构转换成点分十进制
3、int inet_aton(const char * cp, struct in_addr* inp); //和第一个相同,将点分十进制转换成32位整数
1 #include <stdio.h>
2 #include<arpa/inet.h>
3 int main()
4 {
5 unsigned long addr=inet_addr("192.168.0.100");//将其转换成网络字节序
6 printf("addr=%u\n",ntohl(addr));//转成主机字节序号,无符号输出
7
8 struct in_addr ipaddr;
9 ipaddr.s_addr=addr;
10 printf("Ip=%s\n",inet_ntoa(ipaddr));//网络字节序地址转换成点分十进制
11 return 0;
12 }
socket套接字(字节序、地址转换)的更多相关文章
- socket套接字编程
一.概述 1.socket是一种进程间通信方式,既可以用于一台机器,也可以用于网络.常用语C/S模型. 2.可以跨越Windows和Linux操作系统,可以跨越不同语言. 3.注意网络字节序和主机字节 ...
- 网络编程--Socket(套接字)
网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中 有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后 如何可靠高效的进行数据传输.在 ...
- socket套接字TCP API
socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...
- c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换
最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序, ...
- 19 网络编程--Socket 套接字方法
1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...
- Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...
- 8.7 day28 网络编程 socket套接字 半连接池 通信循环 粘包问题 struct模块
前置知识:不同计算机程序之间的数据传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- Java网络编程(一)Socket套接字
一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...
- socket套接字编程 HTTP协议
socket套接字编程 套接字介绍 1. 套接字 : 实现网络编程进行数据传输的一种技术手段 2. Python实现套接字编程:import socket 3. 套接字分类 >流式套接 ...
随机推荐
- spring cloud 实现基于Nacos权重的负载均衡
package com.water.step.service.user.nacos; import com.alibaba.nacos.api.exception.NacosException; im ...
- C++分隔字符串split
split C++标准库中没有提供split分隔字符串的函数,哎. 实现一 下面的实现需要指定分隔符的集合delimiters,以及是否将连续的分隔符看作同一个分隔compress : enum cl ...
- 【git冲突解决】: Please commit your changes or stash them before you merge.
刚刚使用 git pull 命令拉取代码时候,遇到了这样的问题: error: Your local changes to the following files would be overwritt ...
- 2018HUAS_ACM暑假比赛5题解
目录 Problem A Problem B Problem C Problem D Problem E Problem F Problem A 思路 这是一道带权并查集问题 因为只有三种种类,我们分 ...
- Nacos配置中心使用
在系统开发过程中,开发者通常会将一些需要变更的参数.变量等从代码中分离出来独立管理,以独立的配置文件的形式存在.目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进 ...
- Rest Framework设计规范
Rest Framework Rest Framework是前后端分离中用到的一种规范,它与框架本身无关,是一种软件架构风格,全称为Representational State Transfer. R ...
- Parquet 列式存储格式
Parquet 列式存储格式 参考文章: https://blog.csdn.net/kangkangwanwan/article/details/78656940 http://parquet.ap ...
- origin添加两个Y轴
1. 选中X和两个Y 2. 点击Double Y 3. 关掉gap to Symbol,否则Line+Symbol这种显示方式可能显示不出线条
- Eclipse IDE 使用指南:Git失误提交代码,撤销commit操作
在Eclipse IDE使用Git Commit提交代码时把不需要的文件失误Commit了,比如.settings..classpath..project等文件. 如果是Commit提交代码到本地仓库 ...
- Win32编程之控制线程
0x01. 如何让线程停下来 让自己停下来: Sleep() 函数 当程序执行到某段代码的时候可以使用sleep() 函数进行暂停 使用sleep()函数挂起的时候会自动恢复过来的 让别人停下来: S ...