socks5udp_sendto 子例程

用途

通过 SOCKSv5 服务器发送 UDP 包。

标准 C 库 (libc.a)

语法

#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
int socks5udp_sendto (Socket, Message, MsgLen, Flags, Dst, DstLen, Svr, SvrLen)
int Socket;
void *Message;
size_t MsgLen;
int Flags;
struct sockaddr *Dst;
size_t DstLen;
struct sockaddr *Svr;
size_t SrvLen;

描述

socks5udp_sendto 子例程将 UDP 包发送到 Svr ,以便中继到 Dst。  Svr 必须是先前调用 socks5udp_associate时返回的会合地址。

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

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

参数

描述
套接字 指定套接字的唯一名称。
消息 指定包含要发送的消息的地址。
MsgLen 以字节为单位指定消息大小。
标志 允许发送方控制消息传输。 请参阅 sendto 子例程中的描述以获取更具体的详细信息。
DST 指定 SOCKSv5 服务器将尝试将 UDP 包中继到的外部地址。
DstLength 指定 Dst中地址结构的长度。
服务 指定要发送 UDP 包以进行中继的 SOCKSv5 服务器的地址。
SvrLength 指定 Svr中地址结构的长度。

返回值

成功完成后, socks5udp_sendto 子例程返回值 0。

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

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

错误代码 (放置在 errno 中; 继承自对 sendto () 的底层调用)

如果发生以下任何错误,那么 socks5tcp_connect 子例程将失败:

错误 描述
EBADF Socket 参数无效。
ENOTSOCK Socket 参数引用文件,而不是套接字。
EAFNOSUPPORT 指定地址系列中的地址不能与此套接字一起使用。
ENETUNREACH 不存在到网络或主机的路由。
EINVAL 一个或多个指定参数无效。
ENETDOWN 指定的物理网络已关闭。
ENOSPC 设备或系统表上没有剩余空间。

错误代码 (放在 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_sendto 子例程从服务器的套接字请求连接。

void *message;
size_t msglen;
int flags;
struct sockaddr_in svr;
struct sockaddr_in6 dst;
.
.
.
socks5udp_associate(s,(struct sockaddr*)&dst, sizeof(dst), (struct sockaddr *)&svr, sizeof(svr));
.
.
.
socks5udp_sendto(s, message, msglen, flags (struct sockaddr*)&dst, sizeof(dst), (struct sockaddr *)&svr, sizeof(svr));