diff --git a/src/client.cpp b/src/client.cpp
index d4b1516..9b60686 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -227,7 +227,7 @@ int websocket_handler(Socket *socket, stds *pipes) {
             socket->receive(pipes->stdin);
         } else {
             ungetc(c, pipes->stdout);
-            socket->send(pipes->stdout, -1);
+            socket->send(pipes->stdout);
         }
     }
 }
diff --git a/src/network/Socket.cpp b/src/network/Socket.cpp
index 91425fe..d0f4f27 100644
--- a/src/network/Socket.cpp
+++ b/src/network/Socket.cpp
@@ -236,6 +236,18 @@ long Socket::send(const char *str) {
     return send(str, strlen(str));
 }
 
+long Socket::send(FILE *file) {
+    char buffer[CPPNET_CHUNK];
+    long all_len = 0;
+    long len = 0;
+    do {
+        len = fread(buffer, 1, CPPNET_CHUNK, file);
+        send(buffer, len);
+        all_len += len;
+    } while (len > 0 && len == CPPNET_CHUNK);
+    return all_len;
+}
+
 Socket::~Socket() {
 
 }
diff --git a/src/network/Socket.h b/src/network/Socket.h
index 11ed472..0752c00 100644
--- a/src/network/Socket.h
+++ b/src/network/Socket.h
@@ -34,6 +34,8 @@ private:
 
     void setSocketOption(int, bool);
 
+    long send(void *buffer, int size);
+
     long receive(void *buffer, int size);
 
     long peek(void *buffer, int size);
@@ -63,8 +65,6 @@ public:
 
     void sslHandshake(string privkey, string fullchain);
 
-    long send(void *buffer, int size);
-
     long send(string *str);
 
     long send(string str);
@@ -73,6 +73,8 @@ public:
 
     long send(const char *str, long length);
 
+    long send(FILE *file);
+
     string receive();
 
     string receive(long length);