socks5tcp_connect 子例程
用途
连接到 SOCKSv5 服务器并请求与外部目标的连接。
库
标准 C 库 (libc.a)
语法
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h> int socks5tcp_connect (Socket, Dst, DstLen, Svr, SvrLen)
int Socket;
struct sockaddr *Dst;
size_t DstLen;
struct sockaddr *Svr;
size_t SrvLen;描述
socks5tcp_connect 子例程请求从 Svr中指定的 SOCKSv5 服务器连接到 Dst 。 如果成功, Dst 和 Svr 将被外部连接的实际地址覆盖,后续写入和读取 套接字 将通过 Svr进行中继。
套接字 必须是类型为 SOCK_STREAM; Dst 和 Svr 可以是 IPv4 或 IPv6 地址。
可以在定义了 COMPAT_43 的情况下编译套接字应用程序。 这将使 sockaddr 结构 BSD 4.3 兼容。 有关更多详细信息,请参阅 socket.h。
参数
| 项 | 描述 |
|---|---|
| 套接字 | 指定套接字的唯一名称。 |
| DST | 指定 SOCKSv5 服务器将尝试连接的目标套接字的外部地址。 |
| DstLength | 指定 Dst中地址结构的长度。 |
| 服务 | 如果非 NULL ,那么指定要用于请求中继连接的 SOCKSv5 服务器的地址。 |
| SvrLength | 指定 Svr中地址结构的长度。 |
返回值
成功完成后, socks5tcp_connect 子例程将返回值 0 ,并修改 Dst 和 Svr 以反映所创建外部套接字的实际端点。
如果 socks5tcp_connect 子例程不成功,那么系统处理程序将执行下列功能:
- 向调用程序返回-1。
- 将指示通用系统错误的错误代码移动到 errno 全局变量中。
- 将指示特定 SOCKSv5 错误的错误代码移动到 socks5_errno 全局变量中。
- Dst 和 Svr 保持不变。
错误代码 (放置在 errno 中; 继承自用于 connect () 的底层调用)
如果发生以下任何错误,那么 socks5tcp_connect 子例程将失败:
| 错误 | 描述 |
|---|---|
| EBADF | Socket 参数无效。 |
| ENOTSOCK | Socket 参数引用文件,而不是套接字。 |
| EADDRNOTAVAIL | 指定的地址在本地机器上不可用。 |
| EAFNOSUPPORT | 指定地址系列中的地址不能与此套接字一起使用。 |
| EISCONN | 套接字已连接。 |
| ETIMEDOUT | 建立连接之前已超时。 |
| 生态环境 | 已拒绝尝试连接。 |
| ENETUNREACH | 不存在到网络或主机的路由。 |
| EADDRINUSE | 指定的地址已在使用中。 |
| Efault | Address 参数不在用户地址空间的可写部分中。 |
| 互联网络促进 | 套接字标记为非分块。 无法立即完成连接。 应用程序可以在连接过程中选择要写入的套接字。 |
| 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 | 找不到服务器。 |
示例
以下程序片段说明客户机使用 socks5tcp_connect 子例程从服务器的套接字请求连接。
struct sockaddr_in svr;
struct sockaddr_in6 dst;
.
.
.
socks5tcp_connect(s,(struct sockaddr*)&dst, sizeof(dst), (struct sockaddr *)&svr, sizeof(svr));