一 什么是socket
socket是最初由伯克利分校为unix设计的通信机制,它对网络通信的底层(各协议栈)进行了封装(例如tcp/ip协议栈由操作系统设计,已经集成到内核中了,通过socket接口可以来调用系统通信方面的内核函数),使得底成的机制对用户来说是透明的。后来其他的厂商也实现了各自的socket,包括微软等公司,为了兼容unix套接字,他们的接口和unix socket的接口是一致的。unix socket 一般分为三种: SOCK_STREAM(tcp socket), SOCK_DGRAM(udp), raw socket(自己指定底成的协议,原生套接字).
二 unix socket使用
1. 包含的头文件
#include <sys/socket.h> 包含了socket接口的声明
#include <netinet/in.h> 包含了tcp/ip(AF_INET)相关地址结构,地址转换函数的声明,sockaddr,sockaddr_in,inet_addr,()inet_ntoa(),inet_aton()
#include <arpa/inet.h> 包含了字节序转换的相关函数 htons() , ntohs(), htonl(),ntohl()
ps:字节序分为大端自己序,和小端字节序。他们影响数据在内存中存放的规律。大端字节序表示数据的高位存在内存的低地址,数据的低位存放在高地址:如 0x12345678 ,假设内存地址从左到右依次递增,则数据从左往右的排列为: 0x12 0x34 0x56 0x78.小端字节序刚好相反。socket通信中,字节序分为网络字节序和本地字节序,网络字节序规定为大端字节序,本地字节序由自己的环境决定,既可以为大端字节序,也可以为小端字节序。在通信的过程中,如果不统一字节序,将导致数据的不一致性。
2. protocol families 协议家族
协议家族就是一组协议的集合,例如tcp/ip。AF_INET, AF_IPX, AF_PACKET,都是socket定义好的协议家族,其中AF_INET指的就是tcp/ip.以下是linux文档中指明的相关协议家族。
Name Purpose Man page
AF_UNIX, AF_LOCAL Local communication unix(7)
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
AF_IPX IPX - Novell protocols
AF_NETLINK Kernel user interface device netlink(7)
AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7)
AF_AX25 Amateur radio AX.25 protocol
AF_ATMPVC Access to raw ATM PVCs
AF_APPLETALK Appletalk ddp(7)
AF_PACKET Low level packet interface packet(7)
3 .协议家族的地址结构
a.通用的地址结构
不同的协议家族的地址结构是不一样的,不过他们都可以转换成通用的socket地址结构:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
b.AF_INET协议家族的地址结构
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order 2