int srs_hijack_io_write(srs_hijack_io_t ctx, void* buf, size_t size, ssize_t* nwrite) { SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; int ret = ERROR_SUCCESS; ssize_t nb_write = ::send(skt->fd, (char*)buf, size, 0); if (nwrite) { *nwrite = nb_write; } if (nb_write <= 0) { // @see https://github.com/simple-rtmp-server/srs/issues/200 if (nb_write < 0 && SOCKET_ERRNO() == SOCKET_ETIME) { return ERROR_SOCKET_TIMEOUT; } return ERROR_SOCKET_WRITE; } skt->send_bytes += nb_write; return ret; }
int srs_hijack_io_read(srs_hijack_io_t ctx, void* buf, size_t size, ssize_t* nread) { SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; int ret = ERROR_SUCCESS; ssize_t nb_read = ::recv(skt->fd, (char*)buf, size, 0); if (nread) { *nread = nb_read; } // On success a non-negative integer indicating the number of bytes actually read is returned // (a value of 0 means the network connection is closed or end of file is reached). if (nb_read <= 0) { if (nb_read < 0 && SOCKET_ERRNO() == SOCKET_ETIME) { return ERROR_SOCKET_TIMEOUT; } if (nb_read == 0) { errno = SOCKET_ECONNRESET; } return ERROR_SOCKET_READ; } skt->recv_bytes += nb_read; return ret; }
int srs_hijack_io_writev(srs_hijack_io_t ctx, const iovec *iov, int iov_size, ssize_t* nwrite) { SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; int ret = ERROR_SUCCESS; ssize_t nb_write = ::writev(skt->fd, iov, iov_size); if (nwrite) { *nwrite = nb_write; } // On success, the readv() function returns the number of bytes read; // the writev() function returns the number of bytes written. On error, -1 is // returned, and errno is set appropriately. if (nb_write <= 0) { // @see https://github.com/simple-rtmp-server/srs/issues/200 if (nb_write < 0 && SOCKET_ERRNO() == SOCKET_ETIME) { return ERROR_SOCKET_TIMEOUT; } return ERROR_SOCKET_WRITE; } skt->send_bytes += nb_write; return ret; }
int srs_hijack_io_set_recv_timeout(srs_hijack_io_t ctx, int64_t timeout_us) { SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; int sec = (int)(timeout_us / 1000000LL); int microsec = (int)(timeout_us % 1000000LL); sec = srs_max(0, sec); microsec = srs_max(0, microsec); struct timeval tv = { sec , microsec }; if (setsockopt(skt->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1) { return SOCKET_ERRNO(); } skt->recv_timeout = timeout_us; return ERROR_SUCCESS; }