socks5udp_associate 子例程

用途

连接到 SOCKSv5 服务器,并为后续 UDP 套接字通信请求 UDP 关联。

标准 C 库 (libc.a)

语法

#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
int socks5udp_associate (Socket, Dst, DstLen, Svr, SvrLen)
int Socket;
const struct sockaddr *Dst;
size_t DstLen;
const struct sockaddr *Svr;
size_t SrvLen;

描述

socks5udp_associate 子例程为 什夫尔中指定的 SOCKSv5 服务器上的 德斯特 请求 UDP 关联。 成功时,将使用会合地址来覆盖 德斯特什夫尔应该将后续 UDP 包发送到该地址以进行中继。

 插座 必须是类型为 SOCK_STREAM; 德斯特什夫尔 可能是 IPv4 或 IPv6 地址的开放式套接字描述符。

请注意, 插座 不能用于发送后续 UDP 包 (必须创建类型为 SOCK_DGRAM 的第二个套接字)。

可以使用定义的 COMPAT_43 来编译套接字应用程序。 这将使 sockaddr 结构 BSD 4.3 兼容。 有关更多详细信息,请参阅 socket.h

参数

描述
套接字 指定套接字的唯一名称。
DST 指定目标套接字的外部地址, SOCKSv5 客户机期望将 UDP 包发送到该目标套接字。
DstLength 指定 德斯特中的地址结构的长度。
什夫尔 指定要用来请求关联的 SOCKSv5 服务器的地址。
SvrLength 指定 什夫尔中的地址结构的长度。

返回值

成功完成后, socks5udp_associate 子例程将返回值 0 ,并使用 Rendezvous 地址覆盖 德斯特

如果 socks5udp_associate 子例程不成功,那么系统处理程序执行以下功能:

  • 向调用程序返回-1。
  • 将指示一般系统错误的错误代码移动到 错误号 全局变量中。
  • 将表示特定 SOCKSv5 错误的错误代码移动到 socks5_errno 全局变量中。

错误代码 (放在 errno 中; 继承自底层调用 connect ())

如果发生以下任何错误,那么 socks5udp_associate 子例程不成功:

错误 描述
EBADF 插座 参数是无效的。
ENOTSOCK 插座 参数引用的是文件,而不是套接字。
EADDRNOTAVAIL 指定的地址在本地机器上不可用。
EAFNOSUPPORT 指定的地址系列中的地址不能与此套接字一起使用。
EISCONN 套接字已连接。
ETIMEDOUT 在建立连接之前,建立连接已超时。
生态环境 连接尝试已被拒绝。
ENETUNREACH 不存在到网络或主机的路由。
EADDRINUSE 指定的地址已在使用中。
Efault 地址 参数未包含在用户地址空间的可写部分中。
互联网络促进 套接字标记为非阻塞。 无法立即完成该连接。 应用程序可以选择套接字以在连接过程中进行写入。
EINVAL 指定的一个或多个自变量无效。
ENETDOWN 指定的物理网络已关闭。
ENOSPC 设备或系统表中没有剩余的空间。
ENOTCONN 无法连接该套接字。

错误代码 (放置在 socks5_errno; SOCKSv5-specific 错误中)

如果发生以下任何错误,那么 socks5tcp_connect 子例程不成功:

错误 描述
S5_ESRVFAIL 常规 SOCKSv5 服务器故障。
S5_EPERM SOCKSv5 服务器规则集拒绝。
S5_ENETUNREACH SOCKSv5 服务器无法访问目标网络。
S5_EHOSTUNREACH SOCKSv5 服务器无法访问目标主机。
S5_ECONNREFUSED 目标主机拒绝了 SOCKSv5 服务器连接请求。
S5_ETIMEDOUT 由于 TTL 到期, SOCKSv5 服务器连接失败。
S5_EOPNOTSUPP SOCKSv5 服务器不支持命令。
S5_EAFNOSUPPORT SOCKSv5 服务器不支持地址系列。
S5_ENOSERV 找不到服务器。

示例

以下程序片段说明了客户机使用 socks5udp_associate 子例程在服务器上请求关联的情况。

struct sockaddr_in svr;
struct sockaddr_in6 dst;
.
.
.
socks5udp_associate(s,(struct sockaddr*)&dst, sizeof(dst), (struct sockaddr *)&svr, sizeof(svr));