创建套接字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("...");
全部评论

相关推荐

02-05 08:49
已编辑
武汉大学 Web前端
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务