diff --git a/varnish.module b/varnish.module
index dc2a4b1..fa5030f 100644
--- a/varnish.module
+++ b/varnish.module
@@ -255,12 +255,31 @@ 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) {
+      return _varnish_read_socket($client, $retry-1);
+    }
+    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(
