MSDN Documentation

Windows API Reference
10054
WSA_NOT_EMPTY
The connection has been reset because the endpoint is not empty.

Description

The WSA_NOT_EMPTY error code, represented by the value 10054, signifies that a network connection was reset. This typically occurs when an attempt is made to perform an operation on a socket where data is still present in the receive buffer. Essentially, the remote endpoint detected that there was unread data and chose to reset the connection rather than allowing a new operation to proceed, which could lead to data loss or corruption.

Symbolic Constant: WSA_NOT_EMPTY

Error Value: 10054

Severity: Error

Common Causes

Troubleshooting and Resolution

When you encounter WSA_NOT_EMPTY, consider the following steps:

  1. Ensure Proper Connection Handling:

    Verify that your application is gracefully handling connection closures. This includes properly closing sockets after all data has been sent and received and acknowledging any incoming data before closing.

  2. Check for Pending Data:

    Before closing a socket or initiating a new operation that might conflict with existing data, ensure that the receive buffer is empty. You can do this by attempting to read all available data. A non-blocking read that returns EWOULDBLOCK or EAGAIN indicates that no more data is immediately available.

  3. Review Remote Endpoint Behavior:

    If possible, investigate the behavior of the remote application or system. It might be contributing to the connection resets.

  4. Examine Network Infrastructure:

    If the issue is intermittent or affects multiple clients, investigate any network devices between your application and the remote endpoint.

  5. Implement Timeouts:

    Use appropriate socket timeouts (e.g., SO_RCVTIMEO, SO_SNDTIMEO) to detect unresponsive connections and handle them gracefully, rather than waiting indefinitely for a response that may never come, potentially leading to this error.

Code Example (Conceptual C++)

This example illustrates how one might attempt to clear the receive buffer before closing a socket, although robust error handling and specific socket options would be required in a real-world scenario.


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

// Assume socket 's' is already created and connected

// Attempt to drain the receive buffer
char buffer[1024];
int bytesRead;
DWORD timeout = 100; // Short timeout to check for data
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));

do {
    bytesRead = recv(s, buffer, sizeof(buffer), 0);
    if (bytesRead > 0) {
        // Data was received, process it or simply discard if just draining
    } else if (bytesRead == 0) {
        // Connection gracefully closed by peer
        break;
    } else { // bytesRead == SOCKET_ERROR
        int error = WSAGetLastError();
        if (error == WSAETIMEDOUT || error == WSAEWOULDBLOCK || error == WSAEINTR) {
            // No more data available within the timeout, or interrupted.
            // This is the desired state to proceed with closing.
            break;
        } else {
            // A real error occurred, handle it.
            // Might be WSA_NOT_EMPTY itself or another socket error.
            // Log the error or take appropriate action.
            break;
        }
    }
} while (true);

// Now it might be safer to close the socket
// close_socket(s);
                

See Also