W5100/Ethernet cannot use socket as UDP after using it as TCP

You actually bring up a fantastic point with your DNS example. When you call EthernetClient::connect(char * host, uint8_t port), it does exactly what I do with NTP. It dynamically creates a UDP socket for DNS, connects to a server, and then releases that socket. That should work just fine, except that this bug exists. I'm certain that I can create a scenario with a http server that has a few connects() in it that will start failing on DNS resolution because of the bug. There would be no solution either, because you can't manually specify a socket for the DNS server to use. It just dynamically allocates one from the unused pool.