samedi 28 février 2015

What is the size of a socket send buffer in Windows?

Based on my understanding, each socket is associated with two buffers, a send buffer and a receive buffer, so when I call the send() function, what happens is that the data to send will be placed into the send buffer, and it is the responsibility of Windows now to send the content of this send buffer to the other end.


In a blocking socket, the send() function does not return until the entire data supplied to it has been placed into the send buffer.


So what is the size of the send buffer?


I performed the following test (sending 1 GB worth of data):



#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(atoi("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;
}


Output:



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


send() has returned immediately, does this means that the send buffer has a size of at least 1 GB?


This is some information about the test:



  • I am using a TCP blocking socket.

  • I have connected to a LAN machine.

  • Client Windows version: Windows 7 Ultimate 64-bit.

  • Server Windows version: Windows XP SP2 32-bit (installed on Virtual Box).


Aucun commentaire:

Enregistrer un commentaire