mirror of https://github.com/ARMmbed/mbed-os.git
[mbed::net] Not shutting down the socket, before closing it, is not robust in lwIP
parent
3f96b401b0
commit
be73e26366
|
@ -69,10 +69,12 @@ int Socket::wait_writable(TimeInterval& timeout) {
|
||||||
return select(&timeout._time, false, true);
|
return select(&timeout._time, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Socket::close() {
|
int Socket::close(bool shutdown) {
|
||||||
if (_sock_fd < 0)
|
if (_sock_fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (shutdown)
|
||||||
|
lwip_shutdown(_sock_fd, SHUT_RDWR);
|
||||||
lwip_close(_sock_fd);
|
lwip_close(_sock_fd);
|
||||||
_sock_fd = -1;
|
_sock_fd = -1;
|
||||||
|
|
||||||
|
|
|
@ -65,9 +65,10 @@ public:
|
||||||
*/
|
*/
|
||||||
int get_option(int level, int optname, void *optval, socklen_t *optlen);
|
int get_option(int level, int optname, void *optval, socklen_t *optlen);
|
||||||
|
|
||||||
/** Close the socket file descriptor
|
/** Close the socket
|
||||||
|
\param shutdown free the left-over data in message queues
|
||||||
*/
|
*/
|
||||||
int close();
|
int close(bool shutdown=true);
|
||||||
|
|
||||||
~Socket();
|
~Socket();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "EthernetInterface.h"
|
||||||
|
|
||||||
|
const char* ECHO_SERVER_ADDRESS = "10.2.200.57";
|
||||||
|
const int ECHO_PORT = 7;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
EthernetInterface eth;
|
||||||
|
eth.init(); //Use DHCP
|
||||||
|
eth.connect();
|
||||||
|
printf("IP Address is %s\n", eth.getIPAddress());
|
||||||
|
|
||||||
|
TCPSocketConnection socket;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
while (socket.connect(ECHO_SERVER_ADDRESS, ECHO_PORT) < 0) {
|
||||||
|
printf("Unable to connect to (%s) on port (%d)\n", ECHO_SERVER_ADDRESS, ECHO_PORT);
|
||||||
|
wait(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char hello[] = "Hello World\n";
|
||||||
|
socket.send_all(hello, sizeof(hello) - 1);
|
||||||
|
|
||||||
|
char buf[256];
|
||||||
|
int n = socket.receive(buf, 256);
|
||||||
|
buf[n] = '\0';
|
||||||
|
printf("%s", buf);
|
||||||
|
|
||||||
|
socket.close();
|
||||||
|
wait(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
eth.disconnect();
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Be sure that the tools directory is in the search path
|
||||||
|
import sys
|
||||||
|
from os.path import join, abspath, dirname
|
||||||
|
ROOT = abspath(join(dirname(__file__), "..", ".."))
|
||||||
|
sys.path.append(ROOT)
|
||||||
|
|
||||||
|
from workspace_tools.private_settings import LOCALHOST
|
||||||
|
from SocketServer import BaseRequestHandler, TCPServer
|
||||||
|
|
||||||
|
|
||||||
|
class TCP_EchoHandler(BaseRequestHandler):
|
||||||
|
def handle(self):
|
||||||
|
print "\nHandle connection from:", self.client_address
|
||||||
|
while True:
|
||||||
|
data = self.request.recv(1024)
|
||||||
|
if not data: break
|
||||||
|
self.request.sendall(data)
|
||||||
|
self.request.close()
|
||||||
|
print "socket closed"
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
server = TCPServer((LOCALHOST, 7), TCP_EchoHandler)
|
||||||
|
print "listening for connections on:", (LOCALHOST, 7)
|
||||||
|
server.serve_forever()
|
|
@ -500,6 +500,12 @@ TESTS = [
|
||||||
"dependencies": [MBED_LIBRARIES, RTOS_LIBRARIES, ETH_LIBRARY],
|
"dependencies": [MBED_LIBRARIES, RTOS_LIBRARIES, ETH_LIBRARY],
|
||||||
"supported": CORTEX_ARM_SUPPORT,
|
"supported": CORTEX_ARM_SUPPORT,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "NET_13", "description": "NET: TCP client echo loop",
|
||||||
|
"source_dir": join(TEST_DIR, "net", "echo", "tcp_client_loop"),
|
||||||
|
"dependencies": [MBED_LIBRARIES, RTOS_LIBRARIES, ETH_LIBRARY],
|
||||||
|
"supported": CORTEX_ARM_SUPPORT,
|
||||||
|
},
|
||||||
|
|
||||||
# Vodafone tests
|
# Vodafone tests
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue