一、Socket 是什么?
Socket 是用于网络进程(使用TCP/IP协议的进程)之间的通信的。它起源于Unix,可以说它是一个特殊的文件(与进程一一对应)。可以用“打开--->读写--->关闭”模式来操作,Socket函数便是用来执行操作的。
二、常见的Socket函数
A.socket()函数
int socket(itn domain,int type,int protocol);
功能:该函数对应普通文件的打开操作。它会返回一个socket描述符,描述符唯一标识一个socket。
参数:domain:协议族,决定socket的地址类型,通信中必须采用对应的地址。
type:socket类型。
protocol:指定协议。
返回值:socket 描述符。
注意:当我们用socket()返回一个描述字,该描述字存在于协议族空间,但没有一个具体的地址。
B.bind()函数
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
功能:将地址族的一个特定地址赋给socket。
参数:sockfd:socket()返回的描述字。
addr:指向赋给 sockfd 的协议地址。
addrlen:地址的长度。
返回值:0表示成功,-1表示不成功。
注意:服务器在启动时都会绑定一个众所周知的地址(如ip地址 + 端口号),用于提供服务。而客户端不需要指定,仅仅在connect()(与服务器建立连接)时由系统随机生成即可。
!!!在将一个地址绑定到socket的时候,先将主机字节序列转换为网络字节序
C.listen()函数、connect()函数
int listen(int sockfd,int backlog);
功能:服务器调用socket() ,bind() 后调用 listen() 来监听socket,当客户端此时调用connect()发出连接请求,服务器端会接收到这个请求。
参数:sockfd:服务器监听的socket 描述字。
backlog:socket可以排队的最大连接个数。
返回值:无错误返回0,有错误返回-1。
int connect(int sockfd,const strcut sockaddr *addr,socklen_t addrlen);
功能:与服务器建立连接
参数:sockfd:客户端的socket 描述字。
返回值:成功返回0;否则返回Socket_error 错误。
addr:服务器的socket 地址。
addrlen:服务器地址的长度。
D.accept()函数
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
功能:服务器接收到客户端的connect请求后,调用accept函数接收请求。
参数:sockfd:服务器的socket 描述字。
返回值:成功返回非负值,失败返回-1。
addr:服务器的socket 地址。
addrlen:服务器地址的长度。
E.read()函数、close()函数
网络I/O操作有多组,可自行查略。
read() / write()
readv() / writev()
....
F.close()函数
完成读写操作后关闭响应的socket 描述字。
注意:该操作只是使相应的socket 描述字引用计数-1(多线程应用),当计数为0时,才会关闭socket 描述字。