Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: GSwifiInterface_HelloWorld GSwifiInterface_HelloServo GSwifiInterface_UDPEchoServer GSwifiInterface_UDPEchoClient ... more
Fork of WiflyInterface 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;
-}

GainSpan Wi-Fi GS1011