socket 介绍
(1)、是一个网络编程接口,是一种特殊的文件描述符,主要位于应用层与传输层之间。
(2)、Socket 种类:
流式套接字(SOCK_STREAM) ------------------>TCP
数据报套接字(SOCK_DGRAM) ------------------>UDP
原始套接字(SOCK_RAW)
字节序
大端序:高字节存在低位;
小端序:高字节存在高位;
(网络字节序是大端)
测试主机字节序
主机字节序:小端序,已验证过了;根据 CPU 架构不同。
网络字节序:大端序,一个值在网络传输需要将 小端转换才可以。
示例:
#include <stdio.h>
int main()
{
short a = 0x1234;
char *p = (char *)&a;
if((*p) == 0x12)
{
printf("大端!!!\n");
}
else
{
printf("小端!!!\n");
}
return 0;
}
IP 地址转换
(1). IP 地址转网络字节序
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
将点分十进制 IP 转化为大端序的二进制 IP
int inet_aton(const char *cp, struct in_addr *inp);
// 转换 ip 地址 cp 为网络字节序,存入 inp 所指向的结构体中。
// 成功返回非 0,失败返回 0
功能:将点分十进制 IP 转化为二进制 IP,存储在 inp 中。
参数:
cp:点分十进制 IP
inp:保存二进制 IP 的结构体
typedef uint32_t in_addr_t;
struct in_addr { //存放 ip 的结构体
in_addr_t s_addr;
};
in_addr_t inet_addr(const char *cp);
功能:将点分十进制 IP 转化为二进制 IP,存储在 inp 中。
参数:
cp:点分十进制 IP
返回值:
保存二进制 IP 的结构体
将大端序的二进制 IP 转化为点分十进制的 IP
char *inet_ntoa(struct in_addr in);
功能:将保存二进制 IP 结构体中保存的 IP 转化为一个点分十进制 IP
参数:
in:保存二进制 IP 的结构体
返回值:
点分十进制 IP
使用:
struct in_addr qwe;
inet_aton("192.168.7.3",&qwe);
struct in_addr qwe;
qwe.s_addr=inet_addr("192.168.7.2");//将点分十进制 IP 转化为 2 进制 IP,存储在 qwe.s_addr 中
struct in_addr qwe;
char *ip=inet_ntoa(qwe);
端口号
(1).端口号用于区分不同的网络进程。
(2).端口号取值范围 1~65535 (16 位)。
1 - 5000:系统用;
5000 - 65535 用户使用;
(3).端口号的转化
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
功能:将用户字节序转化为网络字节序
参数:
hostshort:需要转化的数据
返回值:
转化之后的数据
uint16_t ntohs(uint16_t netshort);
功能:将网络字节序转化为用户字节序
参数:
netshort:需要转化的数据
返回值:
转化之后的数据