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;
}
Ejemplo n.º 4
0
 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;
 }