进一步学习套接字函数socket
创建套接字函数socket
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
//成功时返回文件描述符,失败时返回-1。
domain: 套接字中使用的协议族( Protocol Famjly )信息。
type : 套接字数据传输类型信息。
protocol : 计算机间通信中使用的协议信息 。
协议族(Protocol Family, PF)分为以下几类。
重点IPv4(PF_INET)协议。另外,套接字中实际采用的最终协议信息是通过socket
函数的第三个参数传递的 。在指定的协议族范围内通过第一个参数决定第三个参数 。
套接字类型(Type)
套接字类型指 的是套接字的数据传输方式,通过socket函数的第二个参数传递,只有这样才能决定创建的套接字的数据传输方式 。 两种常见的数据传输方式。
- 面向连接的套接字(SOCK_STREM)(TCP)
收发数据的套接字内部有缓冲 (buffer ),简言之就是字节数组 。 通过套接字传输的数据将保存到该数组 。 因此,收到数据并不意味着马上调用read函数。 只要不超过数组容量 ,则有可能在数据填充满缓冲后通过 1 次read函数调用读取全部,也有可能分成多次read函数调用进行读取。也就是说,在面向连接的套接字中, read函数和write函数的调用次数并无太大意义 。所以说面向连接的套接字不存在数据边界 。 - 面向消息的套接字(SOCK_DGREM)(UDP)
协议的最终选择
同一协议族中存在多个数据传输方式相同的协议需要指定第三个参数,否则指定为0。
举例:
创建IPv4协议族中面向连接的套接字
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
。满足前两个条件的只有IPPROTO_TCP
因此第三个参数也可以指定为0。TCP套接字。创建IPv4协议族中面向消息的套接字
sock = socket(PF_INET, SOCK_DGREM, IPPROTO_TCP)
。满足前两个条件的只有IPPROTO_UDP
因此第三个参数也可以指定为0。UDP套接字。