29455a0447
* Fix issue #5507 "Constructor WebServer::WebServer(IPAddress addr, int port) produces an unexpected result" "The class Webserver is declared with two explicit constructors, one with signature: WebServer::WebServer(IPAddress addr, int port) Using this results in a server listening on the port number obtained by converting the value of the IPAddress addr argument (in host byte order) to a uint32_t and then to a uint16_t, which is manifestly not the result that would be expected. ... As for a fix, we can assume from these results that this constructor is not being used and therefore could simply be deleted." * Issue 5507 Reverse changes in commit bee1e7088cef913391155f096b42cd4bb89c5c6f after discussion. Alternative fix to be done. * Fix issue #5507 "Constructor WebServer::WebServer(IPAddress addr, int port) produces an unexpected result" This change adds support for multi-homed servers to libraries/WiFi. It was assumed to be there already by libraries/WebServer, but was not. This led to unexpected results when the IP address-specific constructor of class WebServer was used (see issue 5507). This change was tested using three concurrent instances of WebServer, one bound to the WiFi station address, one bound to the WiFi soft AP address, and one bound to INADDR_ANY. See libraries/WebServer/examples/MultiHomedServers for the test method. * Fix issue #5507 "Constructor WebServer::WebServer(IPAddress addr, int port) produces an unexpected result" (cont.) This fixes what I think might be the cause of CI failures on GitHub for the previous commit, namely the absence of an include file in examples/MultiHomedServers. * Fix issue #5507 "Constructor WebServer::WebServer(IPAddress addr, int port) produces an unexpected result" (cont.) Change port numbers in examples/MultiHomedServers per pull-request comment from me-no-dev ... "for this test to be valid, both servers should be on the same port. That is how you can make sure that the functionality works."
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
/*
|
|
Server.h - Server class for Raspberry Pi
|
|
Copyright (c) 2016 Hristo Gochkov All right reserved.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
#ifndef _WIFISERVER_H_
|
|
#define _WIFISERVER_H_
|
|
|
|
#include "Arduino.h"
|
|
#include "Server.h"
|
|
#include "WiFiClient.h"
|
|
#include "arpa/inet.h"
|
|
#include "IPAddress.h"
|
|
|
|
class WiFiServer : public Server {
|
|
private:
|
|
int sockfd;
|
|
int _accepted_sockfd = -1;
|
|
IPAddress _addr;
|
|
uint16_t _port;
|
|
uint8_t _max_clients;
|
|
bool _listening;
|
|
bool _noDelay = false;
|
|
|
|
public:
|
|
void listenOnLocalhost(){}
|
|
|
|
WiFiServer(uint16_t port=80, uint8_t max_clients=4):sockfd(-1),_accepted_sockfd(-1),_addr(INADDR_ANY),_port(port),_max_clients(max_clients),_listening(false),_noDelay(false) {
|
|
log_v("WiFiServer::WiFiServer(port=%d, ...)", port);
|
|
}
|
|
WiFiServer(const IPAddress& addr, uint16_t port=80, uint8_t max_clients=4):sockfd(-1),_accepted_sockfd(-1),_addr(addr),_port(port),_max_clients(max_clients),_listening(false),_noDelay(false) {
|
|
log_v("WiFiServer::WiFiServer(addr=%s, port=%d, ...)", addr.toString().c_str(), port);
|
|
}
|
|
~WiFiServer(){ end();}
|
|
WiFiClient available();
|
|
WiFiClient accept(){return available();}
|
|
void begin(uint16_t port=0);
|
|
void begin(uint16_t port, int reuse_enable);
|
|
void setNoDelay(bool nodelay);
|
|
bool getNoDelay();
|
|
bool hasClient();
|
|
size_t write(const uint8_t *data, size_t len);
|
|
size_t write(uint8_t data){
|
|
return write(&data, 1);
|
|
}
|
|
using Print::write;
|
|
|
|
void end();
|
|
void close();
|
|
void stop();
|
|
operator bool(){return _listening;}
|
|
int setTimeout(uint32_t seconds);
|
|
void stopAll();
|
|
};
|
|
|
|
#endif /* _WIFISERVER_H_ */
|