¿Cuál es el tamaño de un buffer de envío de socket en Windows?

Según mi entendimiento, cada socket está asociado con dos buffers, un buffer de envío y un buffer de recepción, así que cuando llamo alsend() función, lo que sucede es que los datos a enviar se colocarán en el búfer de envío, y ahora es responsabilidad de Windows enviar el contenido de este búfer de envío al otro extremo.

En una toma de bloqueo, elsend() la función no regresa hasta que todos los datos proporcionados se hayan colocado en el búfer de envío.

Entonces, ¿cuál es el tamaño del búfer de envío?

Realicé la siguiente prueba (enviando 1 GB de datos):

#include <stdio.h>

#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

#include <Windows.h>

int main()
{
    // Initialize Winsock
    WSADATA wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);

    // Create socket
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);

    //----------------------

    // Connect to 192.168.1.7:12345
    sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("192.168.1.7");
    address.sin_port = htons(12345);
    connect(s, (sockaddr*)&address, sizeof(address));

    //----------------------

    // Create 1 GB buffer ("AAAAAA...A")
    char *buffer = new char[1073741824];
    memset(buffer, 0x41, 1073741824);

    // Send buffer
    int i = send(s, buffer, 1073741824, 0);

    printf("send() has returned\nReturn value: %d\nWSAGetLastError(): %d\n", i, WSAGetLastError());

    //----------------------

    getchar();
    return 0;
}

Salida:

send() has returned
Return value: 1073741824
WSAGetLastError(): 0

send() ha regresado de inmediato, ¿significa esto que el búfer de envío tiene un tamaño de al menos 1 GB?

Esta es información sobre la prueba:

Estoy usando un socket de bloqueo TCP.Me he conectado a una máquina LAN.Versión de Windows del cliente: Windows 7 Ultimate 64-bit.Versión de Windows del servidor: Windows XP SP2 de 32 bits (instalado en Virtual Box).

Editar: También intenté conectarme a Google (173.194.116.18:80) y obtuve los mismos resultados.

Edición 2: He descubierto algo extraño, establecer el búfer de envío en un valor entre 64 KB y 130 KB hará quesend() trabaja como se esperaba!

int send_buffer = 64 * 1024;    // 64 KB
int send_buffer_sizeof = sizeof(int);
setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)send_buffer, send_buffer_sizeof);

Edición 3: Resultó (gracias a Harry Johnston) que he usadosetsockopt() de manera incorrecta, así es como se usa:

setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)&send_buffer, send_buffer_sizeof);

Establecer el búfer de envío en un valor entre 64 KB y 130 KBno hacersend() trabajar como se esperabasino más bien configurar el búfer de envío en0 hace que se bloquee (esto es lo que noté de todos modos, no tengo ninguna documentación para este comportamiento).

Entonces mi pregunta ahora es: ¿dónde puedo encontrar una documentación sobre cómosend() (y tal vez otras operaciones de socket) funcionan en Windows?

Respuestas a la pregunta(3)

Su respuesta a la pregunta