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));