@@ -293,7 +293,7 @@ int SocketImpl::sendBytes(const void* buffer, int length, int flags)
293293 if (_sockfd == POCO_INVALID_SOCKET ) throw InvalidSocketException ();
294294 rc = ::send (_sockfd, reinterpret_cast <const char *>(buffer), length, flags);
295295 }
296- while (rc < 0 && lastError () == POCO_EINTR );
296+ while (_blocking && rc < 0 && lastError () == POCO_EINTR );
297297 if (rc < 0 ) error ();
298298 return rc;
299299}
@@ -315,11 +315,13 @@ int SocketImpl::receiveBytes(void* buffer, int length, int flags)
315315 if (_sockfd == POCO_INVALID_SOCKET ) throw InvalidSocketException ();
316316 rc = ::recv (_sockfd, reinterpret_cast <char *>(buffer), length, flags);
317317 }
318- while (rc < 0 && lastError () == POCO_EINTR );
318+ while (_blocking && rc < 0 && lastError () == POCO_EINTR );
319319 if (rc < 0 )
320320 {
321321 int err = lastError ();
322- if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT )
322+ if (err == POCO_EAGAIN && !_blocking)
323+ ;
324+ else if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT )
323325 throw TimeoutException ();
324326 else
325327 error (err);
@@ -340,7 +342,7 @@ int SocketImpl::sendTo(const void* buffer, int length, const SocketAddress& addr
340342 rc = ::sendto (_sockfd, reinterpret_cast <const char *>(buffer), length, flags, address.addr (), address.length ());
341343#endif
342344 }
343- while (rc < 0 && lastError () == POCO_EINTR );
345+ while (_blocking && rc < 0 && lastError () == POCO_EINTR );
344346 if (rc < 0 ) error ();
345347 return rc;
346348}
@@ -365,15 +367,17 @@ int SocketImpl::receiveFrom(void* buffer, int length, SocketAddress& address, in
365367 if (_sockfd == POCO_INVALID_SOCKET ) throw InvalidSocketException ();
366368 rc = ::recvfrom (_sockfd, reinterpret_cast <char *>(buffer), length, flags, pSA, &saLen);
367369 }
368- while (rc < 0 && lastError () == POCO_EINTR );
370+ while (_blocking && rc < 0 && lastError () == POCO_EINTR );
369371 if (rc >= 0 )
370372 {
371373 address = SocketAddress (pSA, saLen);
372374 }
373375 else
374376 {
375377 int err = lastError ();
376- if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT )
378+ if (err == POCO_EAGAIN && !_blocking)
379+ ;
380+ else if (err == POCO_EAGAIN || err == POCO_ETIMEDOUT )
377381 throw TimeoutException ();
378382 else
379383 error (err);
@@ -851,9 +855,17 @@ bool SocketImpl::getBroadcast()
851855
852856void SocketImpl::setBlocking (bool flag)
853857{
858+ #if !defined(POCO_OS_FAMILY_UNIX)
854859 int arg = flag ? 0 : 1 ;
855860 ioctl (FIONBIO , arg);
856- _blocking = flag;
861+ #else
862+ int arg = fcntl (F_GETFL );
863+ long flags = arg & ~O_NONBLOCK ;
864+ if (!flag)
865+ flags |= O_NONBLOCK ;
866+ (void ) fcntl (F_SETFL , flags);
867+ #endif
868+ _blocking = flag;
857869}
858870
859871
@@ -907,6 +919,24 @@ void SocketImpl::ioctl(poco_ioctl_request_t request, void* arg)
907919}
908920
909921
922+ #if defined(POCO_OS_FAMILY_UNIX)
923+ int SocketImpl::fcntl (poco_fcntl_request_t request)
924+ {
925+ int rc = ::fcntl (_sockfd, request);
926+ if (rc == -1 ) error ();
927+ return rc;
928+ }
929+
930+
931+ int SocketImpl::fcntl (poco_fcntl_request_t request, long arg)
932+ {
933+ int rc = ::fcntl (_sockfd, request, arg);
934+ if (rc == -1 ) error ();
935+ return rc;
936+ }
937+ #endif
938+
939+
910940void SocketImpl::reset (poco_socket_t aSocket)
911941{
912942 _sockfd = aSocket;
0 commit comments