Un servidor SOCKS5 escribe catro bytes por separado, e o cliente só funciona cando esas escrituras se combinan. Combinalas pode cambiar o momento, pero TCP segue sen prometer unha lectura por escritura.

O cliente necesita un analizador de respostas. Tras a selección de método e calquera autenticación necesaria, unha resposta de comando SOCKS5 comeza con catro bytes: versión, resultado, byte reservado e tipo de enderezo. A lonxitude restante depende dese tipo de enderezo.

Un analizador para .NET 7+ que só necesite consumir unha resposta CONNECT correcta pode usar:

static async Task ReadConnectReply(Stream stream, CancellationToken ct)
{
    byte[] prefix = new byte[4];
    await stream.ReadExactlyAsync(prefix, ct);
    if (prefix[0] != 5 || prefix[2] != 0)
        throw new IOException("Invalid SOCKS5 reply");
    if (prefix[1] != 0)
        throw new IOException($"SOCKS5 request failed: {prefix[1]}");

    int remaining;
    switch (prefix[3])
    {
        case 1: remaining = 4 + 2; break;
        case 4: remaining = 16 + 2; break;
        case 3:
            byte[] length = new byte[1];
            await stream.ReadExactlyAsync(length, ct);
            remaining = length[0] + 2;
            break;
        default:
            throw new IOException("Unknown SOCKS5 address type");
    }
    await stream.ReadExactlyAsync(new byte[remaining], ct);
}

Os dous últimos bytes son o porto vinculado. IPv4 necesita catro bytes; IPv6 necesita dezaseis; un enderezo de dominio leva un byte de lonxitude antes do nome.

Subministra un token de cancelación co prazo de negociación previsto. ReadExactlyAsync xestiona lecturas individuais máis curtas e lanza unha excepción cando o fluxo remata antes da lonxitude solicitada. Se falla, descarta a conexión fallida pola ruta de limpeza do seu propietario.

Se ten éxito, detente no límite da resposta. Os bytes posteriores pertencen ao protocolo de destino. Unha lectura especulativa maior debe conservar os bytes sobrantes en vez de descartar o inicio do fluxo da aplicación.

Artigos relacionados