unix网络编程笔记三

て烟熏妆下的殇ゞ 提交于 2019-11-26 19:30:39

accept函数

#include<sysy/socket.h>
int socket(int family,int type,int protocol);

使用这个函数创建一个套接字,函数执行成功返回一个套接字描述符,套接字描述符是一个小的整形数据,第一个参数表示地址族,第二个参数为套接字类型,第三个参数使用0来自适应前两个参数。

family的取值

  • AF_INET表示IPv4
  • AF_INET6表示IPv6
  • AF_LOCAL表示unix域协议
  • AF_ROUTE表示路由协议
  • AF_KEY表示秘钥协议

type的取值

  • SOCK_STREAM表示流式套接字
  • SOCK_DGRAM表示数据报套接字
  • SOCK_RAW表示原始套接字

函数成功返回文件描述符,失败返回-1。

connect函数

#include<sys/socket.h>
int connect(int sockfd,struct sockaddr *seraddr,socklen_t addrlen);
										函数执行成功返回0,失败返回-1

如果使用的是TCP协议,则这个函数的执行动作是三次握手,主动和服务器进行连接,这个函数是阻塞的,当成功或者出错时返回。

当是一个TCP连接会出现以下几种错误情况

  1. 返回ETIMEDOUT错误,这个错误表示没有收到服务器端对SYN的响应,当客户端向服务器发送SYN时没有收到回应便会隔一段时间再发,如果每次都没有回应,这个函数便会返回这个错误,表示建立连接超时。
  2. 返回ECONNREFUSED错误,这个错误表示当客户端发送SYN时,收到的回应为RST,表示建立连接被拒绝,原因是服务器没有在指定的端口上监听。

产生RST的几个原因

  1. 目的端口上接收到SYN时,但是该端口上没有开启监听服务便会返回一个RST。
  2. TCP想要取消一个已连接时。
  3. 当一个没有连接的数据包到达时。

RST包的作用

  1. 表示强制关闭连接

bind函数

#include<sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);
											成功返回0,失败返回-1

这个函数的作用便是给指定的套接字绑定地址。

bind函数通常使用在服务器端,给一个服务器绑定ip和端口号,表示接收目的地址为特定ip和端口号的数据包。

客户端可以不绑定ip和端口号,会随机使用自身的ip地址和端口号,如果自身有多个ip也可以绑定的定的ip地址和端口号来作为数据包的源ip和源端口号。

服务器绑定ip可以使用通配地址INADDR_ANY表示服务器监听所有的ip地址。

listen函数

#include<sys/socket.h>
int listen(int sockfd,int backlog)
				成功返回0,失败返回-1

这个函数做了两件事

  • 将sockfd套接字设置为监听套接字,能够接受目的地址指向这个套接字的数据包。
  • 设置了最多连接个数。

监听套接字维护两个队列

在这里插入图片描述

  • 未完成连接的队列:表示已经接收到客户端的SYN处于SYN_RCVD状态,但是三次握手还没有完成的客户端。
  • 已完成连接的队列:表示已经完成连接的客户。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!