private fork

Fork of GSwifiInterface by gs fan

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;
-}