套接字是应用层和运输层的接口,是应用程序和底层网络通信的通信端口。从网络读数据,写数据到网络中,控制网络协议,都是通过套接字。
创建套接字:
#include <sys/socket.h>
socket(int domain, int type, int protocol) //在通信域domain中创建了一个类型为type,使用协议为protocol的套接字,并返回一个描述字。
说明:
domain: 通信域,就是你希望创建的套接字在哪里用,不同的通信域有不同的网络协议族,有不同的地址结构。允许的通信域有:AF_UNIX(同一台计算机上两个进程通过文件系统通信);AF_INET(网络通信,IPv4地址);AF_INET6(网络通信,IPv6地址)。
type: 套接字类型。主要有三种:SOCK_STREAM,SOCK_DGRAM;SOCK_RAW。 SOCK_STREAM是字节流套接字,他提供的是面向连接的,双向的,可靠的,顺序的,不重复的字节流。也就是你从这边传的什么顺序,在远程收到的就是什么顺序。它之所以能提供这样的服务是因为在底层使用了TCP协议。 SOCK_DGRAM是数据报套接字,它使用的是用户数据报协议UDP,所以不保证数据报是顺序的可靠的和不重复的。 还有一种SOCK_RAW套接字,主要用于访问更低层次的网络层,测试和开发网络协议用的。
protocol: 使用什么协议。由上面两个参数可以知道,一般定义了domain和type之后,协议就定下来了,所以这个参数可以设为0,就是让系统选择默认协议。但是如果domain和type的组合能有多种协议可以选择,那么这时候这个参数就要写具体使用哪种协议。通信双方的套接字必须使用相同的协议!
关闭套接字:
#include <unistd.h>
int close(int socket);
有时候不需要关闭套接字,只需要断开连接:
#include <sys/socket.h>
int shutdown(int socket, int how);
这个函数可以全部断开,也可以部分断开,取决于how的取值:
SHUT_RD: 停止接受数据
SHUT_WR: 停止发送数据,忽略等待传送的数据
SHUT_RDWR: 停止从该套接字接收和发送数据。