最近突然想了解一些关于socket()里面的一些函数的参数,及其使用情况,网上找了半天都是些碎片,自己拿来整理一下,有什么不足之处欢迎批评指正!
1.int socket(int af , int type ,int protocol)
1.首先来看af 协议域又称协议族,协议族决定了socket的地址类型,在通信中必须采用对应的地址,
常用的协议族有:AF_INET(决定了要用ipv4地址与端口号的组合), AF_INET6 , AF_LOCAL 。
2.type :指socket类型,常用到的有:SOCK_STREAM SOCK_DGRAM SOCK_RAW SOCK_PACKET 等。
SOCK_STREAM是基于TCP的,数据传输比较有保障。SOCK_DGRAM是基于UDP的,专门用于局域网,基于广播。
关于UDP
1、UDP协议适用端口分辨运行在同一台设备上的多个应用程序,UDP有不提供数据报分组、组装和不能对数据包进行排序的缺点。
也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
2、在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。
3、但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
关于TCP
1、TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。
2、TCP特性:
(1)面向连接的传输; (2)端到端的通信; (3)高可靠性,确保传输数据的正确性,不出现丢失或乱序; (4)全双工方式传输; (5)采用字节流方式,即以字节为单位传输字节序列; (6)紧急数据传送功能。
所以如果你需要传输的数据是准确的,建议采用TCP,也就是sock_stream
如果你传输的是视频音频等数据,丢几个包也无所谓的,可以采用UDP,也就是sock_dgram。
3.protocol:指定协议:常用的协议有:IPPROTO_TCP 、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等:
他们分别对应:TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
PS: 透明进程间通信(Transparent Inter-process Communication, TIPC) 是一种用于进程间通信的网络通信协议,原本是为集群间通信特别设计的。它允许设计人员能够创建可以和其它应用快速可靠地通信应用,无须考虑在其它需要通信的应用在机群环境中的位置。
PS:并不是上面的type 和protocol可以随意组合。如:SOCKET_STREAM和IPPROTO_UDP就不可以组合。当protocol为0时,会自动选择type 类型对应的默认协议。
至此,我们如果使用socket函数创建一个socket时,返回的socket描述字存在于协议族(即就是:AF_**中)空间中。但是他没有对应的地址,如果想给他赋予一个地址,就必须使用bind()函数。
2.bind()函数
int bind(int sockfd ,int const struct sockaddr *addr ,socklen_t addrlen);
1.sockfd :这是一个描述字,唯一标示一个socket, bind()函数就是给这个描述字绑定一个名字。
2. addr:一个const struct sockaddr*类型的指针。指向sockfd的协议地址,
PS:协议地址,他的结构会根据开始时创建socket时的地址协议不同而不同。例如:
IPV4对应的地址协议结构:
struct sockaddr_in
{
sa_family sin_family;
in_port_t sn_port;
struct int_addr sin_addr;
};
struct in_addr
{
uint32_t s_addr;
};
当然还有IPV6对应的地址协议的结构,大家自己查吧!只是多了两个参数。
3. addrlen:对应的是地址的长度。一般都用sizeof(struct sockaddr).
3.listen()
listen(int sockfd,int backlog)
第一个参数为监听的描述字,第二个参数为相应socket可排队等待的最大连接个数。
4.connect()
connect(int sockfd ,const struct sockaddr *addr ,socklen_t addrlen)
第一个参数为客户端的描述字,第二个参数为服务器的socket地址,都三个参数为socket地址长度。
5.accept()
int accept(in sockfd, struct sockaddr* addr,socklen_t *addrlen) ;
第一个参数是监听套接字,其实说白了就是一个地址和一个端口号的组合。