参数指向的地址的大小(以字节为单位)。

如果未发生错误, 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 地址和端口。

如果套接字未连接,则为
getsockname 函数可用于确定与套接字关联的本地端口号,但返回的 IP 地址设置为给定协议 (的通配符地址,例如,IPv4 的INADDR_ANY或“0.0.0.0”或IN6ADDR_ANY_INIT或“:”对于 IPv6) 。

sendto 的成功完成并不表示数据已成功传递。

sendto 函数通常用于无连接套接字,以便将数据报发送到由 参数 标识的特定对等套接字。 即使无连接套接字以前已连接到特定地址, to 参数也会仅覆盖该特定数据报的目标地址。 在面向连接的套接字上,忽略 to tolen 参数,使 sendto 等效于 发送

注意 发出阻止 Winsock 调用(如 sendto )时,Winsock 可能需要等待网络事件,然后调用才能完成。 在这种情况下,Winsock 会执行可警报的等待,这可以通过异步过程调用 (APC) 在同一线程上计划的异步过程调用中断。 在同一线程上中断持续阻塞 Winsock 调用的 APC 中发出另一个阻止 Winsock 调用将导致未定义的行为,并且永远不会由 Winsock 客户端尝试。
以下示例演示 了 sendto 函数的使用。
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
    int iResult;
    WSADATA wsaData;
    SOCKET SendSocket = INVALID_SOCKET;
    sockaddr_in RecvAddr;
    unsigned short Port = 27015;
    char SendBuf[1024];
    int BufLen = 1024;
    //----------------------
    // 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上发送广播 (,可以构造由 to 参数指向的地址,以包含 Winsock2.h) 中定义的特殊 IPv4 地址INADDR_BROADCAST (,以及预期的端口号。 如果 to 参数指向 的地址包含INADDR_BROADCAST地址和预期端口,则广播将在该端口的所有接口上发送。

如果广播应仅在特定接口上发送,则 由 to 参数指向的地址应包含接口和预期端口的子网广播地址。 例如,子网掩码为 255.255.255.255.0 的 IPv4 网络地址为 192.168.1.255。

广播数据报通常不应超过出现的碎片的大小,这意味着数据报的数据部分(不包括标头)不应超过 512 字节。

如果传输系统中没有可用的缓冲区空间来保存要传输的数据, 则 sendto 将阻止,除非套接字处于非阻止模式。 在非阻塞、面向流的套接字上,写入的字节数可以介于 1 和请求的长度之间,具体取决于客户端和服务器系统上的缓冲区可用性。 选择WSAAsyncSelectWSAEventSelect 函数可用于确定何时可以发送更多数据。

允许调用 len 为零sendto,并将返回零作为有效值。 对于面向消息的套接字,发送零长度传输数据报。

标志参数可用于影响函数调用的行为,这些行为超出了为关联套接字指定的选项。 此函数的语义由套接字选项和 标志 参数确定。 后者使用带下列任何值的按位 OR 运算符构造。

MSG_DONTROUTE :指定数据不应受到路由的约束。 Windows 套接字服务提供商可以选择忽略此标志。 MSG_OOB 仅) SOCK_STREAM等流式套接字发送 OOB 数据 (。

Windows Phone 8:Windows Phone 8 及更高版本上Windows Phone应用商店应用支持此函数。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。