W5500 connects to ESP8266, but server does not find client

So i have this W5500 shield, and after a bit of fiddling i got it to respond and show me the IP address on the Serial port.
I first uploaded an example

#include <SPI.h>
#include <Ethernet.h>

#define RX_PIN 13
#define SD_CS 15
#define W5500_CS 2 

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,2);

void setup() {
  Serial.begin(115200);

  // disable SD card if one in the slot
  pinMode(SD_CS,OUTPUT);
  digitalWrite(SD_CS,HIGH);

  Serial.println("Starting ethernet");
  Ethernet.init(W5500_CS);  // set the CS pin
  Ethernet.begin(mac,ip);
  pinMode(RX_PIN, INPUT);
  delay(1000);
  pinMode(RX_PIN, FUNCTION_2);
  Serial.println(Ethernet.localIP());
}

void loop() {
}

There is also an SD card in the schematic which uses GPIO15 as CS, and the W5500 uses GPIO2 for that.
I did a small check on the pinMode, basically i am using GPIO 13 both for SPI and as an RX pin for UART0, and i wanted to make sure that i can keep doing this (i did the same thing with the SD card and that went fine) and i think it's fine. As an SPI master you transfer information at the moment that you want.
So anyway this works as expected, so i thought i should try a basic webserver

#define RX_PIN 13
#define SD_CS 15
#define W5500_CS 2

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEB
};
IPAddress ip(192, 168, 0, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);

  pinMode(SD_CS, OUTPUT);
  digitalWrite(SD_CS, HIGH);
  Serial.println();
  Serial.println("Starting ethernet");
  Ethernet.init(W5500_CS);  // set the CS pin
  Ethernet.begin(mac, ip);
  pinMode(RX_PIN, INPUT);
  delay(1000);
  pinMode(RX_PIN, FUNCTION_2);

  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  static uint32_t ipshow = millis();
  if (millis() - ipshow > 1000) {
    ipshow = millis();
    Serial.print("server is at ");
    Serial.println(Ethernet.localIP());
  }
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(0);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

and again the Serial monitor returns the information i expect to get, but when i connect a UTP cable to the RJ45 to my laptop i should just be able to type the IP address in my browser and get served the page (i must be missing something here of course) but this doesn't happen.
There is no firewall settings anywhere i have to change is there ? i mean my browser has permission.
I added the sending of the IP to check if the w5500 is still properly connected to the ESP8266 (it's a 12-f btw)

I can of course not be sure there is not a power issue, but i am thinking to exclude that possibility.
atm it is powered from the 5v pin of an UNO (that i am using as the USB-TTL) and both the ESP and the W5500 are getting 3.3v by converting that with a LD1117 3.3v in a TO-220 package, this hardly gets warm, and with the 5v providing near 500mA (i actually realize this is all on a dongle , but it should still be more than 400mA) i am fairly confident this is not the cause, the w5500 uses a lot less power than the wifi part of the ESP8266, and that is not connected to anything. (it is still on, there are valid credentials still in the wifi part of the flash, so the AP does show up)
But again maybe i'm wrong.
All of the schematics i can provide, but really it is quite a lot of work (which will need doing at some point i guess) and it connects to the ESP's SPI just fine, and the rest doesn't really need drawing.
So what am i missing ?

is that IP address valid on your network?

Yes it is.

try the WebClient example, it has enhanced diagnostics in setup()

OK i'm getting something now on the Serial monitor, but of course i had to plug into my router for that. (and i am missing a long enough UTP cable here, so now i have a longish USB to connect it) But great !! thank you, i have more things to try now. Still i figured i should be able to have a webserver running when i plug the UTP straight into the RJ45 of my laptop as well don't i ? It actually shows the network as connected in the network settings so i am (as always with network stuff) a little puzzled.
But great, i have things to try !

if you connect directly, make sure the network interlaces on PC are separate networks. because if you use an IP address which is valid on other network interlace it could be that the connection will be attempted to the other network interlace (WiFi?).

so if the mask is 255.255.255.0, then the network is the first 3 numbers in the IP address. so if your normal network (WiFi?) has 192.168.0.x, use 192.168.1.x for the Ethernet direct connection

other option is to use 'connection sharing' where Windows configures for example a device on Ethernet interface to access the network on WiFi interlace.

Hmm well i tried that, but to no avail. I do have the webserver working connecting through the router now though, so that's progress.
DHCP works, which is what i am aiming for, though manual does still need to be tested.

that would only be relevant for the webClient wouldn't it.

I am actually thinking that i should assign a manual IP to my laptop's ethernet port, but am a little hesitant.

for direct connection it is the only option. there is no DHCP server handling DHCP requests on your computers Ethernet network interface

Yes i figured as much, but what should i by setting for the fields ?
Ah Success !! finally.
Thank you so much for the time and effort
Set the IP of the ESP to
192.168.1.177 (my router is using 192.168.0.xxx )
set the IP of the Ethernet port of the laptop to
192.168.1.120
IPv4 subnet prefix length to 24 (bits)
IPv4 gateway to 10.1.1.3
and that did the trick.

next thing will be to get the wifi webserver working in combination with the ethernet one, and get the alias working.

the esp8266 arduino has lwip_w5500 library which adds w5500 as an network interface for the ESP8266WiFi library (additionally to WiFi and SoftAP network interfaces).
so if you start a ESP8266WebServer it will listen on WiFi and Ethernet

Oh that's good news ! i gotta try that one

Would this be an example that demonstrates the implementation of that ? I didn't really find a decent example in the IDE.
Does that actually also include the UDP services as well ?

hmm i see now it is not a part of the core i am using. That is a motivation to switch i guess, still i would like to keep using the core i am using for now as well or i'll have to either forfeit SPIFFS or OTA updates for the ESP-01's i am using. Well i guess i have to thin8k about it. Actually UDP is all i really want to use W5500 for, the rest is just bonus.

Ok just one more question that you may know the answer too and for which i don't want to create a whole new topic. When attempting to connect the W5500 to a network with DHCP, the function that tries is blocking the program for 90 seconds, is there a way to make this happen in the background ? if i understand correctly, 90 secs is the time in which an IP address can be confirmed / returned, but the way it is now it makes the unit non-responsive for that time if it can not obtain an IP address.

if (Ethernet.begin(mac) == 0) {  // it's blocking here if the w5500 is not connected to a router
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
    DHCP = false;
  }

Ah i actually think i found something, or at least a way of setting the timeout, though it is rather nested away.

int EthernetClass::begin(uint8_t *mac_address)
{
#ifndef ESP8266
  static DhcpClass s_dhcp;
#endif
  _dhcp = &s_dhcp;


  // Initialise the basic info
  W5100.init();
  SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
  W5100.setMACAddress(mac_address);
  W5100.setIPAddress(IPAddress(0,0,0,0).raw_address());
  SPI.endTransaction();

  // Now try to get our config info from a DHCP server
  int ret = _dhcp->beginWithDHCP(mac_address);
  if(ret == 1)

begin(mac) calls beginWithDHCP(mac_address),
which is defined as part of the DhcpClass

int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000);

with the timeout set to 60 seconds by default,
that function in turn calls request_DHCP_lease();

int DhcpClass::beginWithDHCP(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout)
{
    _dhcpLeaseTime=0;
    _dhcpT1=0;
    _dhcpT2=0;
    _lastCheck=0;
    _timeout = timeout;
    _responseTimeout = responseTimeout;

    // zero out _dhcpMacAddr
    memset(_dhcpMacAddr, 0, 6); 
    reset_DHCP_lease();

    memcpy((void*)_dhcpMacAddr, (void*)mac, 6);
    _dhcp_state = STATE_DHCP_START;
    return request_DHCP_lease();
}

which makes a bunch of requests with responseTimeout set to 4 seconds for each of the requests,

while(_dhcp_state != STATE_DHCP_LEASED)
    {

until either a lease has been obtained, or

if(result != 1 && ((millis() - startTime) > _timeout))
            break;

or it times out and the while loop is broken.
I guess as a quick fix i could modify the timeout setting from the default, hmm adding it as an overloaded begin() is causing issues, with begin already overloaded with the IP address.
Ideally of course the whole thing should be done in the background, but that will take some more effort to do.
hehe next step.