diff --git a/varnish.module b/varnish.module
index bc44636..4b4da2a 100644
--- a/varnish.module
+++ b/varnish.module
@@ -253,12 +253,35 @@ function _varnish_terminal_run($command) {
   return $ret;
 }
 
-function _varnish_read_socket($client) {
+/**
+ * Low-level socket read function.
+ *
+ * @params
+ *   $client an initialized socket client
+ *
+ *   $retty how many times to retry on "temporarily unavalble" errors
+ */
+function _varnish_read_socket($client, $retry = 2) {
   // status and length info is always 13 characters. 
   $header = socket_read($client, 13, PHP_BINARY_READ);
   if ($header == FALSE) {
     $error = socket_last_error();
-    watchdog('varnish', 'Socket error: !error', array('!error' => socket_strerror($error)), WATCHDOG_ERROR);
+    // 35 = socket-unavailable, so it might be blocked from our write.
+    // This is an acceptable place to retry.
+    if ($error == 35 && $retry > 0) {
+      $retry--;
+      $status = _varnish_read_socket($client, $retry);
+      if ($status['code'] == 200) {
+        return $status;
+      }
+    }
+    else {
+      watchdog('varnish', 'Socket error: !error', array('!error' => socket_strerror($error)), WATCHDOG_ERROR);
+      return array(
+        'code' => $error,
+        'msg' => socket_strerror($error),
+      );
+    }
   }
   $msg_len = (int) substr($header, 4, 6) + 1;
   $status = array(
