Linux Socket套接字描述符详解
套接字又名socket,是一个接口,进程可以利用该接口和其他进程通信。无论是其他进程在本机上还是在其他机器上。
套接字接口有许多不同的网络协议。包括TCP/IP协议栈!
就如使用文件描述符来访问文件一样。
程序是用套接字描述符来访问套接字。
#include<sys/socket.h>
int socket(int domain,int type,int protocol) 接下来来详细介绍这三个参数
1.domain
就如写信一样,不同国家写信的地址写法不同,英国美国有从街-区-市的从小到大的地址写法!而中国的地址写法
是从大到小,市-区-街。就如不同域有着不同地址表示格式。
常见的域是:AF_INET(IPV4域),AF_INET6(IPV6域),AF_UNIX,AF_UPSPEC...
2.type
有SOCK_DGRAM 固定长度的 无连接的 不可靠的报文传递。两个进程不需要建立连接只需要向对方进程套接字发送一个报文。
(有点像写信,你发送信息就代表你写了很多信件。每封都有地址,接收人。)
有SOCK_STREAM 可靠的,有序的,双向的连接型字节流。
(有点像,你建了一条管道到别人家,建好以后你不用去送信,只需不断往管道里投字条。对方也可以往管道里投纸条到你家。)
有SOCK_SEQPACKET
(和SOCK_STREAM 类似只是从套接字得到的不是字节流而是基于报文的服务。)
有SOCK_RAM
(用于访问下面的网络层即IP层。构造自己的协议头部。)
3.protocol
这个参数通常是0,在前2个参数已经确认的情况下一般用来选择默认的协议。比如在AF_INET SOCK_STREAM的情况下默认选择TCP
在AF_INET SOCK_DGREAM 的情况下默认选择UDP!
就像一个文件描述符一样。可以用read函数 write函数对文件描述符进行操作。同理可以对套接字描述符进行操作。
但是并不是所有的文件描述符操作都适用于套接字描述符。最常用的对套接字描述符的操作是shutdown
#include<sys/socket.h>
int shutdown(int sockfd,int how)
如果how是SHUT_RD 表示关闭读端无法再从套接字里读取
如果how是SHUT_WR 表示关闭写段无法再往套接字里写
how是SHUT_RDWR 说明同时无法写和读!
可以关闭一个方向开启另一个方向,比如关闭了写端但是还可以继续读取!