由 to
参数指向的地址的大小(以字节为单位)。
如果未发生错误,
sendto
将返回发送的总字节数,这可能小于
len
指示的数量。 否则,将返回值 SOCKET_ERROR,并且可以通过调用
WSAGetLastError
检索特定的错误代码。
sendto
函数用于在套接字上写入传出数据。 对于面向消息的套接字,必须注意不要超过基础子网的最大数据包大小,这可以通过使用
getsockopt
检索套接字选项的值SO_MAX_MSG_SIZE获得。 如果数据太长,无法通过基础协议以原子方式传递,则会返回错误
WSAEMSGSIZE
,并且不会传输任何数据。
to
参数可以是套接字地址系列中的任何有效地址,包括广播地址或任何多播地址。 若要发送到广播地址,应用程序必须使用
启用了SO_BROADCAST的 setsockopt
。 否则,
sendto
将失败并显示错误代码
WSAEACCES
。 对于 TCP/IP,应用程序可以发送到任何多播地址 (,而无需成为组成员) 。
注意
如果打开套接字,进行
setsockopt
调用,然后进行
sendto
调用,Windows 套接字将执行隐式
绑定
函数调用。
如果套接字未绑定,系统会将唯一值分配给本地关联,然后将套接字标记为绑定。 如果套接字已连接,则
getsockname
函数可用于确定与套接字关联的本地 IP 地址和端口。
如果未连接套接字,则为
getockname
函数可用于确定与套接字关联的本地端口号,但返回的 IP 地址设置为给定协议的通配符地址 (例如,INADDR_ANY或 IPv4 的“0.0.0.0”,对于 IPv6) IN6ADDR_ANY_INIT或“::”。
sendto
的成功完成并不表示数据已成功传递。
sendto
函数通常用于无连接套接字,以将数据报发送到由
to
参数标识的特定对等套接字。 即使无连接套接字以前已连接到特定地址,
to
参数也仅覆盖该特定数据报的目标地址。 在面向连接的套接字上,忽略
to
和
tolen
参数,使
sendto
等效于
send
。
注意
发出阻止的 Winsock 调用(如
sendto)
时,Winsock 可能需要等待网络事件,然后才能完成呼叫。 在这种情况下,Winsock 执行可发出警报的等待, (在同一线程上计划的 APC) 异步过程调用可能会中断。 在 APC 内发出另一个阻止 Winsock 调用,该调用中断了同一线程上正在进行的阻止 Winsock 调用将导致未定义的行为,并且 Winsock 客户端绝不能尝试。
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"WSAStartup failed with error: %d\n", iResult);
return 1;
//---------------------------------------------
// Create a socket for sending data
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SendSocket == INVALID_SOCKET) {
wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
//---------------------------------------------
// Set up the RecvAddr structure with the IP address of
// the receiver (in this example case "192.168.1.1")
// and the specified port number.
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(Port);
RecvAddr.sin_addr.s_addr = inet_addr("192.168.1.1");
//---------------------------------------------
// Send a datagram to the receiver
wprintf(L"Sending a datagram to the receiver...\n");
iResult = sendto(SendSocket,
SendBuf, BufLen, 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
if (iResult == SOCKET_ERROR) {
wprintf(L"sendto failed with error: %d\n", WSAGetLastError());
closesocket(SendSocket);
WSACleanup();
return 1;
//---------------------------------------------
// When the application is finished sending, close the socket.
wprintf(L"Finished sending. Closing socket.\n");
iResult = closesocket(SendSocket);
if (iResult == SOCKET_ERROR) {
wprintf(L"closesocket failed with error: %d\n", WSAGetLastError());
WSACleanup();
return 1;
//---------------------------------------------
// Clean up and quit.
wprintf(L"Exiting.\n");
WSACleanup();
return 0;
对于使用 IP (版本 4 的套接字)
若要仅) SOCK_DGRAM发送广播 (,可以构造
由 参数
指向的地址,以包含 Winsock2.h) 中定义的特殊 IPv4 地址INADDR_BROADCAST (以及预期的端口号。 如果
由 to
参数指向的地址包含INADDR_BROADCAST地址和预期端口,则广播将在所有接口上发送到该端口。
如果广播只应在特定接口上发送,则
to
参数指向的地址应包含接口的子网广播地址和预期端口。 例如,子网掩码为 255.255.255.0 的 IPv4 网络地址 192.168.1.0 将使用子网广播地址 192.168.1.255。
广播数据报通常不应超过出现的碎片的大小,这意味着数据报的数据部分(不包括标头)不应超过 512 字节。
如果传输系统中没有可用于保存要传输的数据的缓冲区空间,除非套接字已置于非阻止模式,
否则 sendto
将阻止。 在非阻止、面向流的套接字上,写入的字节数可以介于 1 和请求的长度之间,具体取决于客户端和服务器系统上的缓冲区可用性。
select
、
WSAAsyncSelect
或
WSAEventSelect
函数可用于确定何时可以发送更多数据。
允许使用
len
为零调用
sendto
,并将返回零作为有效值。 对于面向消息的套接字,将发送零长度传输数据报。
flags
参数可用于影响为关联套接字指定的选项之外的函数调用行为。 此函数的语义由套接字选项和
flags
参数确定。 后者是使用以下任一值的按位 OR 运算符构造的。
MSG_DONTROUTE
:指定数据不应受到路由的约束。 Windows 套接字服务提供程序可以选择忽略此标志。
MSG_OOB
仅) (流式套接字(例如SOCK_STREAM)发送 OOB 数据。
Windows Phone 8:
Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。
Windows 8.1
和
Windows Server 2012 R2
:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。