socket操作流程中的错误分析

1、SOCKET socket( int af , int type , int protocol );
返回 -1

  • 错误:10047(使用了与请求的协议不兼容的地址)
  • 错误:10044(在这个地址家族中不存在对指定的插槽类型的支持)
  • 错误号:10043(请求的协议还没有在系统中配置,或者没有它存在的迹象)

说明:

  • Socket暂时只支持AF_INET协议族
  • 对非标准的套接字类型不支持
  • 协议号参数可以为0,则使用与套接字类型相应的协议号,否则,协议号参数必须与相应的套接字类型相同

2、int bind( SOCKET s , const struct sockaddr FAR* name , int namelen );
返回 -1

  • 错误号:10038(在一个非套接字上尝试了一个操作)
  • 错误码:10047(使用了与请求的协议不兼容的地址)
  • 错误码:10049( 在其上下文中,该请求的地址无效)
  • 错误码:10048(通常每个套接字地址(协议/网络地址/端口)只允许使用一次)
  • 错误码:10014(系统检测到在一个调用中尝试使用指针参数时的无效指针地址)

说明:

  • 可以bind本机拥有的地址或INADDR_ANY,非本机拥有的地址出错
  • bind已经被占用的端口值会出错
  • len参数要大于等于地址结构实际上所占的长度

3、int listen( SOCKET s , int backlog );
返回-1

  • 错误号:10022(提供了一个无效的参数)

说明:

  • 第一个参数的套接字必须是成功bind过后的

4、SOCKET accept( SOCKET s , struct sockaddr FAR* addr , int FAR* addrlen );
返回-1

  • 错误号:10022(提供了一个无效的参数)
    说明:
  • 主套接字必须处于监听状态

5、int recv( SOCKET s , char FAR* buf , int len , int flags );
返回-1

  • 错误号:10038(在一个非套接字上尝试了一个操作)
  • 错误号:10057(由于套接字没有连接并且当使用一个sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受)
  • 错误号:10014(系统检测到在一个调用中尝试使用指针参数时的无效指针地址)

说明

  • 对服务器来说,必须传递成功accept之后返回的套接字
  • 缓冲区指针所指位置必须有效
  • 缓冲区长度参数不可超过实际准备的缓冲区长度
  • MSG_PEEK标志在接收的时候将保留数据

6、int send( SOCKET s , const char FAR* buf , int len , int flags );
返回-1
同recv

7、int closesocket( SOCKET s );
返回-1

  • 错误号:10038(在一个非套接字上尝试了一个操作)

说明:

  • s必须是有效打开的套接字
  • 不得重复关闭

8、int connect( SOCKET s , const struct sockaddr FAR* name , int namelen );
返回-1

  • 错误码:10061(由于目标机器积极拒绝,无法连接)
  • 错误号:10049(在其上下文中,该请求的地址无效)
  • 错误号:10060(由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败)

说明:

  • 服务器必须启动listen
  • 可以不建立本地半相关,则进行隐式绑定。
  • 客户不可以与INADDR_ANY主动相连,立即返回报错
  • 客户不可以与广播地址连接,会等待很久,返回失败
  • 非阻塞模式下,需要判断EINPROGRESS(表示当前进程正在处理),否则失败
  • ETIMEOUT-connection timed out 目的主机不存在,没有返回任何相应,例如主机关闭
  • ECONNREFUSED-connection refused(硬错)到达目的主机后,由于各种原因建立不了连接,主机返回RST(复位)响应,例如主机监听进程未启用,tcp取消连接等
  • EHOSTTUNREACH-no route to host(软错)路由上引发了一个目的地不可达的ICMP错误
  • ETIMEOUT和EHOSTTUNREACH,客户端会进行定时多次重试,一定次数后才返回错误,另外,当connect连接失败时,sockfd套接口不可用,必须关闭后重新socket分配才行

9、int recvfrom( SOCKET s , char FAR* buf , int len , int flags , struct sockaddr FAR* from , int FAR* fromlen );
返回 -1

  • 错误号:10022(提供了一个无效的参数)

说明

  • 必须先进行本地半相关,指定端口,才能够接收
  • 无法通过recvfrom的地址结构限制接收的地址和端口

10、int sendto( SOCKET s , const char FAR* buf , int len , int flags , const struct sockaddr FAR* to , int tolen );
返回-1

  • 错误号:10054 (远程主机强迫关闭了一个现有的连接)

说明:

  • 可以在未本地半相关的情况下发送数据,由系统随机选择端口
  • 可以向不存在的远端点发送数据,本地仍然报告发送的字节数,不管有没有人接收
  • 当给不存在的对端发送过数据后,会收到错误报告,紧接着的一次recvfrom会立即返回失败

附上比较详细的Linux网络编程socket错误分析 https://www.cnblogs.com/zendu/p/4988110.html

你可能感兴趣的:(网络编程)