【Linux】——socket

TCP和UDP服务通常有一个客户和服务器的关系,而这个网络关系是依靠Socket进行连接和维持的。
Socket是一个软件结构,是指TCP/IP的API。Socket接口定义了许多函数和例程,可以用其来开打TCP/IP协议网络上的应用程序。这篇文章让我们来好好了解一下它吧~

一、socket地址

1、通用socket地址
表示socket地址的是结构体socketaddr
在这里插入图片描述
2、专用socket地址
(1)IPV4
在这里插入图片描述
(2)IPV6
在这里插入图片描述

二、创建socket

在这里插入图片描述

  • 参数一:代表使用哪个底层协议族。
    TCP/IP:PF_INET(IPV4),PF_INEF6(IPV6)
    UNIX:PF_UNIX

  • 参数二:代表服务类型
    SOCK_STREAM服务(流服务)对应TCP
    SOCK_UGRAM(数据报服务)对应UDP

  • 参数三:一般为0(默认协议)

  • 返回值:成功返回socket文件描述符,失败返回-1

三、命令socket——bind

1、命名的含义:将一个socket与socket地址绑定
2、用途:只有命名过后客户端才知道如何连接它
3、具体操作:客户端通常采用匿名的方式,使用操作系统自动分配的socket地址
在这里插入图片描述

  • 参数一:文件描述符
  • 参数二:将my_addr所指的socket地址分配给未命名的soket文件描述符
  • 参数三:该socket地址的长度
  • 返回值:成功返回0,失败返回-1
    4、返回失败原因
    (1)被绑定的地址是受保护的地址,例如:0——1023仅仅root用户可访问
    (2)被绑定地址正在使用中

三、监听socket——listen

1、作用:创建监听队列以存放待处理的客户连接
在这里插入图片描述

  • 参数二:内核监听队列的最大长度,典型值为5
    注意:监听队列中完整连接的上限通常比backlog值略大,一般为(backlog+1)

  • 成功返回0,失败返回-1

四、接受链接——accept

在这里插入图片描述

  • 参数二:获取被接受链接的远端socket地址
  • 参数三:地址长度
  • 返回值:**成功返回一个新的链接socket,**该socket唯一的标识了被接受的这个链接,失败返回-1

问:如果监听队列中处于完全链接状态的连接对应的客户端出现网络异常比如说掉线或者建立连接后立即退出客户端程序,则服务器对这个连接执行的accept调用是否成功?

答:accept调用同样正常返回,因为accept只是从监听队列中取数据,而不论链接处于何种状态,更不关心任何网络状况的变化

五、发起连接——connect

客户端需要如下调用来主动与服务器建立连接
在这里插入图片描述

  • 参数二:服务器监听的socket地址
  • 返回值:成功返回0,一旦成功建立连接,sockfd就唯一地标识了这个链接,客户端就可以通过读写sockfd来与服务器通信,失败返回-1

失败原因:
(1)目标端口不存在,连接被拒绝
(2)连接超时

六、关闭连接——close

在这里插入图片描述
close系统调用是将fd的引用计数-1,只有当引用计数的值为0的时候才是真正关闭连接。一次fork必须在父进程和子进程中都对该socket执行close.

发布了62 篇原创文章 · 获赞 7 · 访问量 2573

猜你喜欢

转载自blog.csdn.net/qq_43412060/article/details/104526418