关于SOCKET编程的一些整理!

1 篇文章 0 订阅
1 篇文章 0 订阅

最近突然想了解一些关于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) ;

第一个参数是监听套接字,其实说白了就是一个地址和一个端口号的组合。

                                                          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值