歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux下zeromq write函數變更

文件tcp_socket.cpp中write函數發生變更,可以去github上看master版本的src/tcp_socket.cpp 點這裡前往github

說下影響,在之前2.2.0版本,其實write函數是這樣的

  1. int zmq::tcp_socket_t::write (const void *data, int size) 
  2.     ssize_t nbytes = send (s, data, size, 0); 
  3.  
  4.     //  Several errors are OK. When speculative write is being done we may not  
  5.     //  be able to write a single byte to the socket. Also, SIGSTOP issued  
  6.     //  by a debugging tool can result in EINTR error.  
  7.     if (nbytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK || 
  8.           errno == EINTR)) 
  9.         return 0; 
  10.  
  11.     //  Signalise peer failure.  
  12.     if (nbytes == -1 && (errno == ECONNRESET || errno == EPIPE)) 
  13.         return -1; 
  14.  
  15.     errno_assert (nbytes != -1); 
  16.     return (size_t) nbytes; 

然後在我以前另外一篇文章中(見http://www.linuxidc.com/Linux/2013-03/80273.htm)有提到過zeromq需要注意的一些細節中有說到很容易碰到connection timeout的錯誤並告知怎麼更改。

最近有碰到在write的時候發生Connection refused 錯誤也就是errno是ECONNREFUSED,還正在想自己加個過濾算了,不過去了github上看了下最新代碼,發現代碼變更了

對錯誤處理的更加友好,而不會向之前對一些比較容易發生的錯誤直接中斷。

下面這部分是直接文本copy過來的。

if (nbytes == -1
&& (errno == ECONNRESET
 || errno == EPIPE
 || errno == ETIMEDOUT))
if (nbytes == -1) {
    errno_assert (errno != EACCES
              && errno != EBADF
              && errno != EDESTADDRREQ
              && errno != EFAULT
              && errno != EINVAL
              && errno != EISCONN
              && errno != EMSGSIZE
              && errno != ENOMEM
              && errno != ENOTSOCK
              && errno != EOPNOTSUPP);
      return -1;
}

errno_assert (nbytes != -1);
  return (size_t) nbytes;
}

Copyright © Linux教程網 All Rights Reserved