我们先来看一下socket函数的原型:
SOCKET PASCAL FAR socket (int af, int type, int protocol);
典型的调用方式为:
unsigned int sockSrv = socket(AF_INET, SOCK_STREAM, 0);
1.af是address family的缩写,实际上就是指明域domain, 这个af主要是用来区分是创建ipv4的套接字还是ipv6的套接字。 当然, 顺便说一下, 如果是在unix中, 第一个参数还可以是AF_UNIX, 表示这个socket既不是ipv4的socket, 也不是ipv6的socket, 而是非网络形式的unix域socket, 可以用来进行非网络形式的进程间通信。 在很多嵌入式系统中, 进程间的通信均是通过非网络形式的unix域套接字来完成的。不过, 我们要明白, unix域套接字的客户端和服务端进行通信时, 客户端和服务端必须位于同一台机器上, 而且效率比网络套接字更高。
2. 我以前总是以为, 这个type值决定了是tcp套接字还是udp套接字, 其实不是的。 type值决定的是流套接字还是数据报套接字或者其他。 注意流套接字不一定是tcp, 数据报套接字也不一定是udp.
3. protocol这个值通常为0, 为0的时候是什么意思呢? 意思是, 如果type是流套接字, 且protocol为0, 那么就是就是默认的流套接字---tcp套接字。 同理, 如果type是数据报套接字, 且protocol为0, 那么就是默认的数据报套接字---udp套接字。
返回值其实就是一个无符号整形,用于标识和索引套接字。可以通过返回值判断套接字是否创建成功。