说起网络编程就必须要提到套接字了,套接字是用来连接不同计算机的应用程序。例如:小王要给小张发送一条信息,他是要发到小张计算机的哪个应用程序上去呢,只有将特定的应用程序绑定一个端口,然后小王绑定端口之后再给小张发过去,这就实现了计算机之间不同软件之间的互联。
套接字最早起源于Unix系统,一开始使用与一台电脑之间的进程间通讯,目前套接字分为两种,基于文件型和基于网络型。其中一台主机的进程间是通过基于文件的套接字进行通讯(AF_UNIX或者AF_LOCAL)。而还有一种基于网络的,可用于不同主机之间的通信(AF_INET和AP_INET6),AF_INET是用于IPV4,而AF_INET6是用于IPV6。
套接字还分为面向连接的和无连接的:
第一种是指TCP类型套接字,在通信前需要建立连接,这种连接是较为可靠的,使用的套接字类型是SOCK_STREAM,TCP传输控制协议,经常和IP协议一起使用,称为TCP/IP协议
第二种主要指UDP类型的套接字,无需连接就可以进行通讯,所有速度较快,但是可靠性不高。而且数据是整个发送,不会分成小块。使用的套接字类型是SOCK_DGRAM,UDP协议通常也与IP协议一起使用
常见的套接字操作有:
bind((hostname, port))
绑定地址(注意这里是元祖)到套接字
listen()
开启TCP监听
accept()
被动接受客户端的连接(阻塞)
客户端套接字
connect((hostname, port))
初始化TCP服务器连接
connect_ex()
connect()的扩展版本,出错时返回错误码,而不是异常
公用的套接字
recv()
接收TCP的数据
send()
发送TCP数据
sendall()
发送完整的TCP数据
recvfrom()
接收UDP数据
sendto()
发生UDP数据,因为没有连接,所以这里要指定发送的目标
getpeername()
连接到当前套接字的远程地址
getsockname()
当前socket地址
getsockopt()
获得套接字的参数
setsockopt()
设置套接字的参数
close()
关闭套接字
面向模块的套接字函数
setblocking()
设置套接字是否是阻塞模式
settimeout()
设置阻塞套接字操作的超时时间
gettimeout()
得到阻塞套接字操作的超时时间
面向文件的套接字函数
fileno()
套接字的文件描述符
makefile()
创建一个与套接字关联的文件对象