服务器端套接字创建过程:
(1)调用socket函数创建套接字,得到套接字文件描述符(Linux下称呼)/套接字句柄(Windows下称呼)
(2)调用bind为套接字分配IP与地址与端口号
(3)调用listen函数将套接字转化为可接收连接的状态
(4)调用accept函数受理连接请求
客户端套接字创建过程:
(1)调用socket函数创建套接字
(2)调用connect函数先服务器端请求连接
创建的套接字因为后续调用的函数的不同而成为不同的客户端,调用bind、listen函数成为服务器端套接字、调用connect成为客户端套接字
服务器端创建的套接字被称为服务端套接字与监听套接字,服务器端套接字只负责数据的监听、并不负责数据的收发。客户端的套接字负责数据的收发。
在Linux中:
由于在Linux中一切皆是文件,因此socket操作与文件操作没有区别,在网络传输过程中也可以使用文件I/O相关函数
文件描述符是文件在被打开或创建时系统返回的一个非负整数,从标准输入(0)、输出(1)、错误(2)开始顺序往上递增直到OPEN_MAX文件描述符相当于文件的代号,好比9527在唐伯虎点秋香中是星爷的代号一样。
使用TCP套接字:
预备步骤0:包含头文件sys/socket.h
(5)(3)调用文件I/O相关函数write或read向套接字中写入/读取数据
(6)(4)调用文件I/O相关函数close关闭套接字
其中第5步也可以使用函数send与recv
在Windows中:
预备步骤0:包含头文件winsock2.h并连接库ws2_32.lib
属性-配置属性-输入-附加依赖项
(0)调用函数WSAStartup初始化winsock与相关库,其参数一需要使用宏函数MAKWORD设置Winsock版本
(5)(3)调用函数send与recv发收数据(win下严格区分文件与套接字,必须使用这两函数)
(6)(4)调用函数closesocket关闭套接字并WSACleanup注销winsock库
将创建套接字比喻为打电话:
服务器端:安装电话机(创建套接字)、为电话机分配区号与电话号码(绑定IP与端口)、连接电话线(将套接字转化为可接收连接的状态)、等待并接听电话(受理连接请求)、通话(收发数据)、挂电话(关闭套接字)
客户端:安装电话机(创建套接字)、拨号打电话(请求指定IP与端口)、通话、挂电话
关于协议:简单的说就是计算机间为了完成数据交换而定的约定
套接字类型:
1、面向连接套接字(SOCK_STREAM)(2)面向消息的套接字(SOCK_DGRAM)
面向连接套接字特点:
(1)传输过程中数据不会丢失
(2)按序传递数据(先传一定先到)
(3)传输的数据无数据边界
(4)套接字需一一对应(在一个TCP通信中,仅有两个同样特性的套接字连接)
无数据边界:
套接字内部有一个buffer(字节数组)用于保存通过套接字传输的数据,可以在buffer满后一次读取,也可以分成读取
可靠性:当read函数读取速度比接收数据慢时,缓冲区有可能满,此时为保证传输可靠性,套接字将停止数据传输,也就是说 面向连接的套接字会根据接收端的状态传输数据,如果出错还会重传。
总结:面向连接的套接字是可靠的、按序传递的、基于字节的、两方连接的套接字
2、面向消息套接字特点:
(1)强调快速而非顺序(有比面向连接更快的速度)
(2)数据可能丢失或损毁(无法避免数据丢失或损毁)
(3)数据有数据边界(接受次数必须与发送次数一致)
(4)限制每次传输数据大小(传输大的数据需要分多次发送、多次接受)
(5)无连接
总结:面向消息的套接字是不可靠的、不按顺序的、以数据高速传输为目的的、限制数据包大小且不存在连接的套接字