private fork
Fork of GSwifiInterface by
Diff: Socket/UDPSocket.cpp
- Revision:
- 8:64184a968e3b
- Parent:
- 5:78943b3945b5
- Child:
- 10:7d8134e7df01
--- a/Socket/UDPSocket.cpp Wed Jan 30 05:52:14 2013 +0000 +++ b/Socket/UDPSocket.cpp Thu Oct 31 06:41:45 2013 +0000 @@ -49,13 +49,29 @@ Timer tmr; int idx = 0; + if (_cid < 0 && _wifi->isConnected()) { + // Socket open + if (_server) { + _cid = _wifi->listen(GSwifi::PROTO_UDP, _port); + } else { + _cid = _wifi->open(GSwifi::PROTO_UDP, remote.get_address(), remote.get_port(), _port); + } + if (_cid < 0) return -1; + } + tmr.start(); while ((tmr.read_ms() < _timeout) || _blocking) { - idx += sendPacket(remote, packet, length); + if (_server) { + idx += _wifi->sendto(_cid, packet, length, remote.get_address(), remote.get_port()); + } else { + idx += _wifi->send(_cid, packet, length); + } + if (idx < 0) { + if (!_wifi->isConnected(_cid)) _cid = -1; + } - if (idx == -1) return -1; if (idx == length) return idx; } @@ -67,41 +83,46 @@ { Timer tmr; int idx = 0; - int nb_available = 0; int time = -1; + char ip[16]; + int port; - if (_cid < 0 || !_wifi->is_connected(_cid)) { + if (_cid < 0 && _wifi->isConnected()) { // Socket open - char cmd[CFG_CMD_SIZE]; if (_server) { - sprintf(cmd, "AT+NSUDP=%d", _port); + _cid = _wifi->listen(GSwifi::PROTO_UDP, _port); } else { - sprintf(cmd, "AT+NCUDP=%s,%d", remote.get_address(), remote.get_port()); - if (_port) { - sprintf(&cmd[strlen(cmd)], ",%d", _port); - } + _cid = _wifi->open(GSwifi::PROTO_UDP, remote.get_address(), remote.get_port(), _port); } - if (_wifi->sendCommand(cmd, GSwifi::RES_CONNECT) == false) return -1; - _cid = _wifi->readCID(); + if (_cid < 0) return -1; } if (_blocking) { - while (1) { - nb_available = _wifi->readable(_cid); - if (nb_available != 0) { + tmr.start(); + while (time < _timeout + 20) { + if (_wifi->readable(_cid)) { break; } + time = tmr.read_ms(); + } + if (time >= _timeout + 20) { + return -1; } } + tmr.reset(); tmr.start(); while (time < _timeout) { - nb_available = _wifi->readable(_cid); - for (int i = 0; i < min(nb_available, length); i++) { - buffer[idx] = _wifi->getc(_cid); - idx++; + if (_server) { + idx += _wifi->recvfrom(_cid, &buffer[idx], length - idx, ip, &port); + } else { + idx += _wifi->recv(_cid, &buffer[idx], length - idx); + } + if (idx < 0) { + if (!_wifi->isConnected(_cid)) _cid = -1; + return -1; } if (idx == length) { @@ -112,47 +133,7 @@ } if (_server) { - char *ip; - int port; - if (_wifi->readRemote(_cid, &ip, &port)) { - remote.set_address(ip, port); - } + remote.set_address(ip, port); } return (idx == 0) ? -1 : idx; } - -int UDPSocket::sendPacket (Endpoint &ep, const char *buf, int len) -{ - char cmd[CFG_CMD_SIZE]; - Timer tmr; - int result = 0; - - if (_cid < 0 || !_wifi->is_connected(_cid)) { - // Socket open - char cmd[CFG_CMD_SIZE]; - if (_server) { - sprintf(cmd, "AT+NSUDP=%d", _port); - } else { - sprintf(cmd, "AT+NCUDP=%s,%d", ep.get_address(), ep.get_port()); - if (_port) { - sprintf(&cmd[strlen(cmd)], ",%d", _port); - } - } - if (_wifi->sendCommand(cmd, GSwifi::RES_CONNECT) == false) return -1; - _cid = _wifi->readCID(); - } - - if (_server) { - // UDP Server - sprintf(cmd, "\x1bY%X%s:%d:%04d", _cid, ep.get_address(), ep.get_port(), len); - _wifi->send(cmd, strlen(cmd)); - result = _wifi->send(buf, len, GSwifi::RES_NORMAL); - } else { - // UDP Client - sprintf(cmd, "\x1bZ%X%04d", _cid, len); - _wifi->send(cmd, strlen(cmd)); - result = _wifi->send(buf, len, GSwifi::RES_NORMAL); - } - - return result; -}