[PD-cvs] SF.net SVN: pure-data: [9628] trunk/externals/mrpeach/net/tcpserver.c

mrpeach at users.sourceforge.net mrpeach at users.sourceforge.net
Thu Mar 27 20:56:13 CET 2008


Revision: 9628
          http://pure-data.svn.sourceforge.net/pure-data/?rev=9628&view=rev
Author:   mrpeach
Date:     2008-03-27 12:56:13 -0700 (Thu, 27 Mar 2008)

Log Message:
-----------
No limit on sendable file size.

Modified Paths:
--------------
    trunk/externals/mrpeach/net/tcpserver.c

Modified: trunk/externals/mrpeach/net/tcpserver.c
===================================================================
--- trunk/externals/mrpeach/net/tcpserver.c	2008-03-27 19:32:39 UTC (rev 9627)
+++ trunk/externals/mrpeach/net/tcpserver.c	2008-03-27 19:56:13 UTC (rev 9628)
@@ -108,6 +108,7 @@
 static void tcpserver_socketreceiver_free(t_tcpserver_socketreceiver *x);
 static void tcpserver_send(t_tcpserver *x, t_symbol *s, int argc, t_atom *argv);
 static void tcp_server_send_bytes(int sockfd, t_tcpserver *x, int argc, t_atom *argv);
+static size_t tcpserver_send_buf(int client, int sockfd, char *byte_buf, size_t length);
 static void tcpserver_client_send(t_tcpserver *x, t_symbol *s, int argc, t_atom *argv);
 static void tcpserver_disconnect(t_tcpserver *x);
 static void tcpserver_client_disconnect(t_tcpserver *x, t_floatarg fclient);
@@ -291,14 +292,8 @@
     int             i, j, d;
     unsigned char   c;
     float           f, e;
-    char            *bp;
-    int             length, sent;
-    int             result;
-    static double   lastwarntime;
-    static double   pleasewarn;
-    double          timebefore;
-    double          timeafter;
-    int             late;
+    int             length;
+    size_t          flen;
     int             sockfd = x->x_fd[client];
     char            fpath[FILENAME_MAX];
     FILE            *fptr;
@@ -357,13 +352,14 @@
 #endif
                     if (j >= MAX_UDP_RECEIVE)
                     {
-                        post ("%s: file too long, truncating at %lu", objName, MAX_UDP_RECEIVE);
-                        break;
+                        flen += tcpserver_send_buf(client, sockfd, byte_buf, j);
+                        j = 0;
                     }
                 }
+                flen += j;
                 fclose(fptr);
                 fptr = NULL;
-                post("%s: read \"%s\" length %d byte%s", objName, fpath, j, ((d==1)?"":"s"));
+                post("%s: read \"%s\" length %d byte%s", objName, fpath, flen, ((d==1)?"":"s"));
             }
             else
             {
@@ -374,38 +370,53 @@
         length = j;
         if (length > 0)
         {
-            for (bp = byte_buf, sent = 0; sent < length;)
+            tcpserver_send_buf(client, sockfd, byte_buf, length);
+        }
+    }
+    else post("%s: not a valid socket number (%d)", objName, sockfd);
+}
+
+static size_t tcpserver_send_buf(int client, int sockfd, char *byte_buf, size_t length)
+{
+    char            *bp;
+    size_t          sent;
+    double          timebefore;
+    static double   lastwarntime;
+    static double   pleasewarn;
+    int             result;
+    int             late;
+    double          timeafter;
+
+    for (bp = byte_buf, sent = 0; sent < length;)
+    {
+        timebefore = sys_getrealtime();
+        result = send(sockfd, byte_buf, (int)(length-sent), 0);
+        timeafter = sys_getrealtime();
+        late = (timeafter - timebefore > 0.005);
+        if (late || pleasewarn)
+        {
+            if (timeafter > lastwarntime + 2)
             {
-                timebefore = sys_getrealtime();
-                result = send(sockfd, byte_buf, length-sent, 0);
-                timeafter = sys_getrealtime();
-                late = (timeafter - timebefore > 0.005);
-                if (late || pleasewarn)
-                {
-                    if (timeafter > lastwarntime + 2)
-                    {
-                        post("%s: send blocked %d msec", objName,
-                            (int)(1000 * ((timeafter - timebefore) + pleasewarn)));
-                        pleasewarn = 0;
-                        lastwarntime = timeafter;
-                    }
-                    else if (late) pleasewarn += timeafter - timebefore;
-                }
-                if (result <= 0)
-                {
-                    sys_sockerror("tcpserver: send");
-                    post("%s: could not send data to client %d", objName, client);
-                    break;
-                }
-                else
-                {
-                    sent += result;
-                    bp += result;
-                }
+                post("%s: send blocked %d msec", objName,
+                    (int)(1000 * ((timeafter - timebefore) + pleasewarn)));
+                pleasewarn = 0;
+                lastwarntime = timeafter;
             }
+            else if (late) pleasewarn += timeafter - timebefore;
         }
+        if (result <= 0)
+        {
+            sys_sockerror("tcpserver: send");
+            post("%s: could not send data to client %d", objName, client);
+            break;
+        }
+        else
+        {
+            sent += result;
+            bp += result;
+        }
     }
-    else post("%s: not a valid socket number (%d)", objName, sockfd);
+    return sent;
 }
 
 /* send message to client using socket number */


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list