/*@ beasy_receive - receive Parameters: + int bfd - bsocket . char *buffer - buffer - int len - length Notes: @*/ int beasy_receive(int bfd, char *buffer, int len) { int ret_val; int num_received; bfd_set readfds; int total = len; num_received = bread(bfd, buffer, len); if (num_received == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { len -= num_received; buffer += num_received; } while (len) { BFD_ZERO(&readfds); BFD_SET((unsigned int)bfd, &readfds); ret_val = bselect(bfd+1, &readfds, NULL, NULL, NULL); if (ret_val == 1) { num_received = bread(bfd, buffer, len); if (num_received == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { if (num_received == 0) { //printf("beasy_receive: socket %d closed\n", bfd); //bmake_blocking(bfd); //printf("beasy_receive: socket read 0 bytes after bselect returned read signalled therefore the socket is closed.\n");fflush(stdout); return 0; } len -= num_received; buffer += num_received; } } else { if (ret_val == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } } } //bmake_blocking(bfd); return total; }
/* * On systems with select, sleep for "microsec" microseconds. */ void MicroSleep(int microsec) { #if HAVE_SELECT || CYGWIN struct timeval tv; tv.tv_sec = 0; tv.tv_usec = microsec; bselect(0, NULL, NULL, NULL, &tv); #endif }
/*@ beasy_receive_some - receive Parameters: + int bfd - bsocket . char *buffer - buffer - int len - length Notes: @*/ int beasy_receive_some(int bfd, char *buffer, int len) { int ret_val; int num_received; bfd_set readfds; num_received = bread(bfd, buffer, len); if (num_received == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { if (num_received > 0) return num_received; } BFD_ZERO(&readfds); BFD_SET(bfd, &readfds); ret_val = bselect(bfd+1, &readfds, NULL, NULL, NULL); if (ret_val == 1) { num_received = bread(bfd, buffer, len); if (num_received == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { if (num_received == 0) { //printf("beasy_receive_some: socket %d closed\n", bfd); //bmake_blocking(bfd); return SOCKET_ERROR; } return num_received; } } return SOCKET_ERROR; }
unsigned int select1(bitRankW32Int * br,unsigned int x) { return bselect(br,x); }
/*@ beasy_send - send Parameters: + int bfd - bsocket . char *buffer - buffer - int length - length Notes: @*/ int beasy_send(int bfd, char *buffer, int length) { #ifdef HAVE_WINSOCK2_H int error; int num_sent; while ((num_sent = write(bfd, buffer, length)) == SOCKET_ERROR) { error = WSAGetLastError(); if (error == WSAEWOULDBLOCK) { //Sleep(0); continue; } if (error == WSAENOBUFS) { // If there is no buffer space available then split the buffer in half and send each piece separately. if (beasy_send(bfd, buffer, length/2) == SOCKET_ERROR) return SOCKET_ERROR; if (beasy_send(bfd, buffer+(length/2), length - (length/2)) == SOCKET_ERROR) return SOCKET_ERROR; return length; } WSASetLastError(error); return SOCKET_ERROR; } return length; #else int ret_val; int num_written; bfd_set writefds; int total = length; num_written = write(bfd, buffer, length); if (num_written == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { length -= num_written; buffer += num_written; } while (length) { BFD_ZERO(&writefds); BFD_SET(bfd, &writefds); ret_val = bselect(1, NULL, &writefds, NULL, NULL); if (ret_val == 1) { num_written = write(((BFD_Buffer*)bfd)->real_fd, buffer, length); if (num_written == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { if (num_written == 0) { //printf("beasy_send: socket closed\n"); return total - length; } length -= num_written; buffer += num_written; } } else { if (ret_val == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } } } return total; #endif }
/*@ beasy_receive_timeout - receive Parameters: + int bfd - bsocket . char *buffer - buffer . int len - length - int timeout - timeout Notes: @*/ int beasy_receive_timeout(int bfd, char *buffer, int len, int timeout) { int ret_val; int num_received; bfd_set readfds; struct timeval tv; int total = len; /* num_received = bread(bfd, buffer, len); if (num_received == SOCKET_ERROR) { return SOCKET_ERROR; } else { len -= num_received; buffer += num_received; } */ while (len) { BFD_ZERO(&readfds); BFD_SET((unsigned int)bfd, &readfds); tv.tv_sec = timeout; tv.tv_usec = 0; ret_val = bselect(bfd+1, &readfds, NULL, NULL, &tv); if (ret_val == 1) { num_received = bread(bfd, buffer, len); if (num_received == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { if (num_received == 0) { //printf("beasy_receive_timeout: socket %d closed\n", bfd); //bmake_blocking(bfd); return total - len; } len -= num_received; buffer += num_received; } } else { if (ret_val == SOCKET_ERROR) { if ((errno != EINTR) || (errno != EAGAIN)) return SOCKET_ERROR; } else { //bmake_blocking(bfd); return total - len; } } } //bmake_blocking(bfd); return total; }