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; Dst 和 Svr 可以是 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));