Revised to prevent DHCPClient::discover from hanging.
Fork of WIZ820ioInterface by
Diff: Socket/TCPSocketServer.cpp
- Revision:
- 5:fb15c35d1e28
- Parent:
- 4:0bcec6272784
- Child:
- 8:6ff41cd782f5
--- a/Socket/TCPSocketServer.cpp Thu Dec 20 15:08:58 2012 +0000 +++ b/Socket/TCPSocketServer.cpp Tue Aug 27 12:50:11 2013 +0000 @@ -17,74 +17,58 @@ */ #include "TCPSocketServer.h" -#include <string> TCPSocketServer::TCPSocketServer() {} // Server initialization int TCPSocketServer::bind(int port) { - char cmd[20]; - + if (_sock_fd < 0) { + _sock_fd = eth->new_socket(); + if (_sock_fd < 0) { + return -1; + } + } // set TCP protocol - wifi->setProtocol(TCP); - + eth->setProtocol(_sock_fd, TCP); // set local port - sprintf(cmd, "set i l %d\r", port); - if (!wifi->sendCommand(cmd, "AOK")) - return -1; - - // save - if (!wifi->sendCommand("save\r", "Stor")) - return -1; - - // reboot - wifi->reboot(); - + eth->sreg<uint16_t>(_sock_fd, Sn_PORT, port); // connect the network - if (wifi->isDHCP()) { - if (!wifi->sendCommand("join\r", "DHCP=ON", NULL, 10000)) - return -1; - } else { - if (!wifi->sendCommand("join\r", "Associated", NULL, 10000)) - return -1; - } - - // exit - wifi->exit(); - - wait(0.2); - wifi->flush(); + eth->scmd(_sock_fd, OPEN); return 0; } int TCPSocketServer::listen(int backlog) { - if (backlog != 1) + if (_sock_fd < 0) { return -1; + } + if (backlog != 1) { + return -1; + } + eth->scmd(_sock_fd, LISTEN); return 0; } int TCPSocketServer::accept(TCPSocketConnection& connection) { - int nb_available = 0, pos = 0; - char c; - string str; - bool o_find = false; - while (1) { - while(!wifi->readable()); - nb_available = wifi->readable(); - for (int i = 0; i < nb_available; i++) { - c = wifi->getc(); - if (c == '*') { - o_find = true; - } - if (o_find && c != '\r' && c != '\n') { - str += c; - pos = str.find("*OPEN*"); - if (pos != string::npos) { - wifi->flush(); - return 0; - } - } + if (_sock_fd < 0) { + return -1; + } + Timer t; + t.reset(); + t.start(); + while(1) { + if (t.read_ms() > _timeout && _blocking == false) { + return -1; + } + if (eth->sreg<uint8_t>(_sock_fd, Sn_SR) == SOCK_ESTABLISHED) { + break; } } -} \ No newline at end of file + uint32_t ip = eth->sreg<uint32_t>(_sock_fd, Sn_DIPR); + char host[16]; + snprintf(host, sizeof(host), "%d.%d.%d.%d", (ip>>24)&0xff, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff); + uint16_t port = eth->sreg<uint16_t>(_sock_fd, Sn_DPORT); + connection._sock_fd = _sock_fd; + connection.set_address(host, port); + return 0; +}