歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下zeromq write函數變更

Linux下zeromq write函數變更

日期:2017/3/1 10:00:42   编辑:Linux編程

文件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. {
  3. ssize_t nbytes = send (s, data, size, 0);
  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. // Signalise peer failure.
  11. if (nbytes == -1 && (errno == ECONNRESET || errno == EPIPE))
  12. return -1;
  13. errno_assert (nbytes != -1);
  14. return (size_t) nbytes;
  15. }

然後在我以前另外一篇文章中(見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