Browse Source

[1452] use recvfrom(2) with MSG_WAITALL instead of read(2). it seems that
partial read can happen on some systems even if all data should have been
transmitted.

JINMEI Tatuya 13 years ago
parent
commit
787a439b41
1 changed files with 4 additions and 3 deletions
  1. 4 3
      src/lib/util/io/socketsession.cc

+ 4 - 3
src/lib/util/io/socketsession.cc

@@ -271,12 +271,13 @@ SocketSessionReceptor::pop() {
     // TODO: error check
 
     uint16_t header_len;
-    const int cc = read(impl_->fd_, &header_len, sizeof(header_len));
+    const int cc = recv(impl_->fd_, &header_len, sizeof(header_len),
+                        MSG_WAITALL);
     assert(cc == sizeof(header_len)); // XXX
     header_len = InputBuffer(&header_len, sizeof(header_len)).readUint16();
     impl_->header_buf_.clear();
     impl_->header_buf_.resize(header_len);
-    read(impl_->fd_, &impl_->header_buf_[0], header_len);
+    recv(impl_->fd_, &impl_->header_buf_[0], header_len, MSG_WAITALL);
 
     InputBuffer ibuffer(&impl_->header_buf_[0], header_len);
     const int family = static_cast<int>(ibuffer.readUint32());
@@ -292,7 +293,7 @@ SocketSessionReceptor::pop() {
 
     impl_->data_buf_.clear();
     impl_->data_buf_.resize(data_len);
-    read(impl_->fd_, &impl_->data_buf_[0], data_len);
+    recv(impl_->fd_, &impl_->data_buf_[0], data_len, MSG_WAITALL);
 
     return (SocketSession(passed_fd, family, type, protocol,
                           impl_->sa_local_, impl_->sa_remote_, data_len,