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:需要转化的数据
返回值:
转化之后的数据