1.1主机字节序和网络字节序
Linux通过函数来完成主机字节和网络字节之间的转换。
htonl 、 htons 、ntohl、ntohs四个函数来实现,
htonl(host to network long);
htons( host to network short );
ntohl(network to host long);
ntohs(network to host short);
1.2通用的socket地址
socket网络编程接口中表示socket地址的是一个结构体socketaddr;
struct socketaddr
{
sa_family_t sa_family;//地址族类型的变量
char sa_data[14];//存放socket地址值
};
1.3专用socket地址
socketaddr_in 用于ipv4
struct socketaddr_in
{
sa_family_t sin_family;//地址族AF_INET
u_int16_t sin_port ;//端口号,需要用网络字节表示
struct inaddr sin_addr;//IPV4地址结构体
};
//IPV4的结构体
struct in_addr
{
u_int32_t s_addr;//IPV4地址,要用网络字节表示;
};
所有专用的socket地址类型的变量,在使用的时候都是需要强制转化socketaddr,因为所有的socket编程接口使用的地址参数类型都是socketaddr;
2.创建socket
int socket( int domain, int type, int protocol);
domain :告诉系统是哪一层协议族;PF_INET—>IPV4
PF_INET6—->IPV6
type :指定是流服务(SOCK_STREAM)还是数据报( SOCK_UGRAM);
protocol :通常是唯一的,我们应该是0;
3.命名socket
我们在创建socket时,我们只是给定了地址族协议,但是未制定是哪一个具体的socket地址。
int blind(int socketfd, const struct socketaddr *my_addr, socklen_t addrlen);
4.监听socket
int listen( int socketfd, int backlog);
backlog :参加监听的最大队列;如果客户端有超过backlog的值,那么就不做处理。
5.接受链接
int accept(int socketfd , struct socketaddr *addr, socketlen_t *addrlen);
accept成功时返回一个新的连接端socket地址,
6.发起连接
当服务器打开成功以后,就处于listen状态,但是客户端还要与之建立连接。
int connet(int socketfd , const struct socketaddr *serv_addr,socketlen_t addrlen);
7.关闭连接
close(int socketfd);
close系统调用并非总是立即关闭一个连接,而是将其计数减1;只有当fd的引用计数为0,才真正的关闭。
socket的过程: