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 。 如果成功, DstSvr 将被外部连接的实际地址覆盖,后续写入和读取 套接字 将通过 Svr进行中继。

套接字 必须是类型为 SOCK_STREAM; DstSvr 可以是 IPv4 或 IPv6 地址。

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

参数

描述
套接字 指定套接字的唯一名称。
DST 指定 SOCKSv5 服务器将尝试连接的目标套接字的外部地址。
DstLength 指定 Dst中地址结构的长度。
服务 如果非 NULL ,那么指定要用于请求中继连接的 SOCKSv5 服务器的地址。
SvrLength 指定 Svr中地址结构的长度。

返回值

成功完成后, socks5tcp_connect 子例程将返回值 0 ,并修改 DstSvr 以反映所创建外部套接字的实际端点。

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

  • 向调用程序返回-1。
  • 将指示通用系统错误的错误代码移动到 errno 全局变量中。
  • 将指示特定 SOCKSv5 错误的错误代码移动到 socks5_errno 全局变量中。
  • DstSvr 保持不变。

错误代码 (放置在 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));