目录
1.socket传输过程图解
以上图片来源于百度搜索。
2. 创建套接字-socket()函数
2.1socket()函数
#include<sys/socket.h> int socket(int domain, int type, int protocol); //成功时返回文件描述符,失败时返回-1
2.2参数1:int domain
domain:套接字中使用的协议族(Protocol Family)信息
通过domain传递套接字中使用的协议分类信息
头文件sys/socket.h中声明的协议族
名称 协议族 PF_INET IPv4互联网协议族 PF_INET6 IPv6互联网协议族 PF_LOCAL 本地通信的UNIX协议族 PF_PACKET 底层套接字的协议族 PF_IPX IPX Novell协议族 2.3参数2:int type
type:套接字数据传输类型信息
通过type传递套接字中使用的数据传输方式,下面为两种具有代表性的数据传输方式:
2.3.1面向连接的套接字(SOCK_STREAM)
特点:(TCP)
(1)传输过程中数据不会消失。
(2)按序传输数据。
(3)传输的数据不存在数据边界。
(4)可靠的,基于字节的面向连接的。
2.3.2面向消息的套接字(SOCK_DGRAM)
特点:(UDP)
(1)强调快速传输而非传输顺序。
(2)传输的数据可能丢失也可能损毁。
(3)传输的数据有数据边界。
(4)限制每次传输的数据大小。
(5)不可靠的,以数据高速传输为目的的。
注:面向消息的套接字不存在连接的概念。
2.3.3对于数据边界的说明
在可靠连接中,无论数据有多大只要不超过接收方的数组容量,就不会出现多次调用read()之类的函数,所以在面向连接的套接字中,数据传输时调用对应函数的次数并没有太大的意义,这即是不存在数据边界。但是在面向消息的连接中,因为强调快速传输,而非按序传输,所以当发生较大的数据时,可能会分成几份进行数据传输,此时接收端必须产生相应的接受次数,即数据的传输次数和接收次数相同,便是存在数据传输边界。
2.4参数3:int protocol
protocol:最终决定计算机间通信使用的协议信息
正常情况下该参数为0,前提是参数1和参数2能确定唯一的协议信息。
但是如果遇到“同一协议族中存在多个数据传输方式相同的协议”时,只使用参数1和参数2无法确定具体使用的协议,所以需要参数3:protocol来最终确定协议。
例如:
int tcp_socket=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
PF_INET:IPv4协议族
SOCK_STREAM:面向连接
满足上面两个条件的只有IPPROTO_TCP协议,所以这里可以将第三个参数设置为0。
如果是IPv4、面向消息,也只有IPPROTO_UDP协议。