创建套接字
int socket(int domain, int type, int protocol)
domain
:套接字中使用的协议族protocol family信息type
:套接字数据传输类型信息protocol
:计算机间通信中使用的协议信息返回值
:成功返回文件描述符。失败返回-1
协议族(Protocol Family)
名称 | 协议族 |
---|---|
PF_INET | IPv4互联网协议族 |
PF_INET6 | IPv6互联网协议族 |
PF_LOCAL | 本地通信的UNIX协议族 |
PF_PACKET | 底层套接字协议族 |
PF_IPX | IPX Novell协议族 |
套接字类型(Type)
- 面向连接的套接字
SOCK_STREAM
,可以比喻成2位工人通过一条传送带传递物品。
- 传输过程中数据不会丢失
- 按序传输数据
- 传输的数据不存在数据边界
不存在数据边界:套接字内部有缓冲(buffer),简而言之就是字符数组。通过套接字传输的数据将保存到该数组中。收到数据并不意味着马上调用read函数。只要不超过数组容量,则有可能数据填充满缓冲后通过一次read函数调用读取全部,也可能分成多次read函数调用进行读取。read函数和write函数的调用次数并无太大意义。
面向连接的套接字会根据接收端的状态传输数据,如果缓冲区被填满,传输端套接字停止传输。如果传输传输出错还会提供重传服务。
可靠的、按序传递的、基于字节的面向连接的数据传输方式。
- 面向消息的套接字
SOCK_DGRAM
,可以比喻成摩托车快递的包裹
- 强调快速传输而非传输顺序
- 传输的数据可能丢失也可呢损毁
- 传输的数据有数据边界
- 限制每次传输的数据大小
不可靠的、不按序传递的、以数据高速传输为目的的
协议的最终选择
大部分情况下可以向第三个参数传递0。
IPv4协议族面向连接的套接字只有TCP套接字,IPPROTO_TCP
。
IPv4协议族面向消息的套接字只有UDP套接字,IPPROTO_UDP
。
Windows平台
SOCKET socket(int af, int type, int protocol)
参数
种类及含义与Linux的socket函数完全相同返回值
:成功时返回socket句柄,失败时返回INVALID_SOCKET
实际上,socket函数返回整数型数据,可以通过int型变量接收 。
同样,发生错误时返回INVALID_SOCKET,其实际值为-1.