美文网首页
socket编程基础

socket编程基础

作者: 哟破赛呦 | 来源:发表于2019-01-28 17:36 被阅读0次

字节序

字节序分为大端字节序小端字节序
大端字节序: 是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
小端字节序: 是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
x86框架采用小端字节序,ARM架构启动时可以 设置大小端字节序。
网络字节序采用大端字节序
字节序的转换:

#include <arpa/inet.h>
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表示network,l表示32位长整数,s表示16位短整数。

地址族

一般而言,在使用套接字通信之前,我们首先要为套接字选定一个地址族(IPv4IPv6)。
在Linux系统中,sys/socket.h头文件定义了繁多的地址族类型,它们都是“AF_”或"IPv6".

地址族 说明
AF_INET 使用TCP或UDP来传输,用IPv4的地址
AF_INET6 使用TCP或UDP来传输,用IPv6的地址。
AF_UNIX 本地协议,使用在Unix和Linux系统上,一般都是当客户端和服务器在同一台及其上的时候使用。

地址结构

很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。

image
 #include <sys/socket.h>
struct sockaddr {
sa_family_t sa_family; /* 地址族 */    
char sa_data[14]; /*地址值,实际可能更长*/    
};
/*IPV4*/
struct sockaddr_in {
__kernel_sa_family_t sin_family; /* AF_INET4 */    
__be16 sin_port; /*端头号*/    
   struct in_addr sin_addr; /* IPv4 地址 */  
/* 8字节填充 */    
unsigned char __pad[__SOCK_SIZE__ ‐ sizeof(short int) ‐    
sizeof(unsigned short int) ‐ sizeof(struct in_addr)];    
};
struct in_addr {
__be32 s_addr;    
};
/*IPV6*/
struct sockaddr_in6 {
unsigned short int sin6_family; /*AF_INET6*/    
__be16 sin6_port; /* 端口 # */    
__be32 sin6_flowinfo; /* IPv6 flow information */    
struct in6_addr sin6_addr; /* IPv6 地址 128bit*/    
__u32 sin6_scope_id; /* scope id (new in RFC2553) */    
};
struct in6_addr {
union {
__u8 u6_addr8[16];    
__be16 u6_addr16[8];    
__be32 u6_addr32[4];    
} in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};
#define UNIX_PATH_MAX 108
/*本地socket通信*/
struct sockaddr_un {
__kernel_sa_family_t sun_family; /* AF_UNIX */    
char sun_path[UNIX_PATH_MAX]; /* pathname */    
};

ip转换

ipv4以及的ipv6点分十进制表达法与二进制整数之间的互转。

#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

inet_pton把字符串src转换成ip地址保存在 dst 中。该函数调用成功返回大于0的整数。
inet_ntop()把网络字节序的ip地址src 转换成字符串保存在 dst中作为返回值返回,参数 sizedst所包含的字节数。
af用来指定要转换的ip属于什么协议族

#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
int main(int argc, char** argv)
{
   struct sockaddr_in sin;  
   char buf[16];    
   memset(&sin, 0, sizeof(sin));    
   sin.sin_family=AF_INET;  
   sin.sin_port=htons(3001);  
   inet_pton(AF_INET, "192.168.1.111", &sin.sin_addr.s_addr);  
   printf("%s\n", inet_ntop(AF_INET, &sin.sin_addr, buf, sizeof(buf)));  
   return 0;
}

相关文章

  • 动脑学院架构篇-Java Socket编程基础及深入讲解

    【Socket】Java Socket编程基础及深入讲解 Socket是Java网络编程的基础,了解还是有好处的,...

  • 【tcp】网络分析好文

    socket 编程基础知识https://cizixs.com/2015/03/29/basic-socket-p...

  • Netty

    一、网络编程基础原理 1 网络编程(Socket)概念 首先注意,Socket不是Java中独有的概念,而是一个语...

  • 2019-03-27 归纳socket

    归纳socket socket socket也称套接字,网络编程的基础。一般情况下我不喜欢直接去说socket的函...

  • socket编程基础

    网络层 物理层(实体)、数据链路层、网络层、传输层、应用层。 TCP连接的三次握手 第一次握手:客户端发送syn包...

  • socket编程基础

    一 . 网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行...

  • socket 编程基础

    TCP 服务器的工作流程: 服务器调用 socket() 创建 socket; 服务器调用 bind() 绑定端口...

  • socket编程基础

    字节序 字节序分为大端字节序和小端字节序大端字节序: 是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内...

  • PHP Socket 编程实战总结

    在进入 PHP Socket 编程实战之前,我们先来了解一下 PHP Socket 的一些基础知识。 一、基础部分...

  • 许世伟的Go语言基础 第五章总结

    第5章 网络编程 5.1 socket编程 以往socket编程: 建立socket:使用socket()函数。 ...

网友评论

      本文标题:socket编程基础

      本文链接:https://www.haomeiwen.com/subject/smoajqtx.html