创建套接字socket函数的详解(sock_stream和sock_dgram的分析)
首先放上创建套接字的代码,再具体讲述函数中每一个参数的具体含义:
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
->成功时返回文件描述,失败时返回-1(linux)
#include <winsock2.h>
SOCKET socket(int af,int type,int protocol);
->成功时返回socket句柄,失败时返回INVALID_SOCKET/
这里有三个参数(以linux下为例):
(1)、domain:套接字中使用的协议族(Protocol Family)信息;
(2)、type:套接字数据传输类型信息
(3)、protocol:计算机间通信中使用的协议信息
其中第一个协议族的信息主要有如下几类,但是常用的是IPV4协议族(PF_INET)
PF_INET:IPv4协议族
PF_INET6:IPv6协议族
PF_LOCAL:本地通信的UNIX协议族
PF_PACKET:底层套接字的协议族
PF_IPX:IPX Novell协议族
第二个参数是套接字类型,具有代表性的又两种:
(1)、面向连接的套接字(SOCK_STREAM)
这种类型的特点有:
a、传输过程中数据不丢失
b、按序传输数据(先发先达)
c、传输的数据不存在数据边界
可以总结为:“可靠地、按序传递的、基于字节的面向连接的数据传输方式的套接字”
(2)、面向消息的套接字(SOCK_DGRAM)
这种类型的特点有:
a、强调快速传输而非传输顺序
b、传输数据可能丢失也可能损坏
c、传输的数据有数据边界
d、限制每次传输的数据大小
可以总结为:“不可靠的、不按顺序的、以数据的高速传输为目的的套接字”
第三个参数主要是作为第一个,第二个参数无法指定类型的时的一种附加,但是通常来说我们常用的套接字不必要用到这一参数,赋值为0即可,这里不做过多赘述,只给出两个例子来说明:
满足IPv4协议,且是面向连接传输的只有:IPPROTO_TCP
int socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
满足IPv4协议,且是面向消息传输的只有:IPPROTO_UDP
int socket(PF_INET,SOCK_STREAM,IPPROTO_UDP);
最后附上Windows下初始化Winsock的模板写法:
SOCKET soc=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if(soc==INVALID_SOCKET)
ErrorHandling("...");