Пример #1
0
int process_request(struct request* p_req, struct response* p_res) {
    CLEAR_BUF(p_res->sta_line.version);
    int n_methods = SIZEOF(methods), i, ret;
    for (i = 0; i != n_methods; i++)
        if (!strcmp(methods[i].name, p_req->req_line.method))
            break;
    if (i < n_methods)
        ret = methods[i].func(p_req, p_res);
    else
        ret = process_method_unsupported(p_req, p_res);
    strcpy(p_res->sta_line.version, RTSP_VERSION);
    return ret;
}
Пример #2
0
int create_response_message(char* resbuf,
    struct response* p_res) {
    CLEAR_BUF(resbuf);
    int i, n = sprintf(
        resbuf, "%s %d %s\r\n",
        p_res->sta_line.version,
        p_res->sta_line.p_status->code,
        p_res->sta_line.p_status->reason_phrase);
    for (i = 0; i != p_res->h_buf.num; i++)
        n += sprintf(resbuf + n, "%s: %s\r\n",
            p_res->h_buf.fields[i]->name, p_res->h_buf.values[i]);
    n += sprintf(resbuf + n, "\r\n");
    if (p_res->entity)
        n += sprintf(resbuf + n, "%s", p_res->entity);
    return n;
}
Пример #3
0
char* token( SchPort* port ) {

    unsigned int c;
    int cls;

    CLEAR_BUF(token_buffer_);

    while( (c = SCH_GETC(port)) != EOF ) {
        cls = ch_class(c);
        if ( cls & CL_WHITESPACE ) {
            break;
        } else if ( cls & (CL_LIST_BEGIN|CL_LIST_END|CL_DELIMITER) ) {
            SCH_UNGETC(c,port);
            break;
        } else {
            PUSH_BUF(token_buffer_,c);
        }
    }
    return token_buffer_;
}
Пример #4
0
int main(int argc, char *argv[])
{
    if (argc < 2)
        exception_exit("No port", "provided");
    int sockfd;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        errno_exit("opening socket failed");

    struct sockaddr_in serv_addr;
    CLEAR(serv_addr);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(atoi(argv[1]));

    if (bind(sockfd, (struct sockaddr *) &serv_addr,
        sizeof serv_addr) == -1)
        errno_exit("binding failed.");

    if (listen(sockfd, 5) == -1)
        errno_exit("listening failed.");

    struct sockaddr_in cli_addr;
    socklen_t clilen = sizeof cli_addr;
    int newsockfd;
    if ((newsockfd = accept(sockfd, 
        (struct sockaddr *) &cli_addr, &clilen)) == -1) 
        errno_exit("accepting failed.");/*
    create_session("192.168.1.113", inet_ntoa(cli_addr.sin_addr));

    struct request req;
    struct response res;
    struct jpeg_frame jframe;
    char buffer[BUFFER_SIZE], resbuf[BUFFER_SIZE];*/
    unsigned char img_buffer[IMG_BUFFER_SIZE];
    struct timespec interval = { 0, 33300000l };
    int n, cnt = 105, ret = 0;/*
    while (1) {
        if (ret == 1) {
            printf("=== cnt: %d ===\n", cnt--);/*
            srand(time(NULL));
            seq = rand() % 0x8000;
            rtptime = rand() % 0x8000000;
            ssrc = rand();*//*
            CLEAR(jframe);
            FILE* fd = fopen("frame.im", "rb");
            n = fread(img_buffer, 1, IMG_BUFFER_SIZE, fd);
            fclose(fd);
            jpeg_get_frame_details(img_buffer, n, &jframe);
            //printf("data size: %d/%d, q table size: %d\n", jframe.data_size, n, jframe.qt_size);
            //printf("w: %d, h: %d, ri: %d\n", jframe.width, jframe.height, jframe.restart_interval);
            //printf("seq: 0x%08x, ts: 0x%08x, ssrc: 0x%08x\n", seq, rtptime, ssrc);
            /*seq = rtp_send_jframe(newsockfd, seq, rtptime, ssrc, &jframe, RTP_JEPG_Q, 0);
            rtptime += 300;
            nanosleep(&interval, NULL);
            continue;
        }
        CLEAR_BUF(buffer);
        if ((n = recv(newsockfd, buffer, BUFFER_SIZE - 1, 0)) == -1)
            errno_exit("reading from socket failed");
        parse_request(buffer, n, &req);
        fprint_request(stdout, &req);

        ret = process_request(&req, &res);
        n = create_response_message(resbuf, &res);
        if ((n = send(newsockfd, resbuf, n, 0)) == -1)
            errno_exit("writing to socket failed");
        printf("====== response %d ======\n%s\n", cnt, resbuf);
    }*/
    unsigned long c_addr;
    memcpy(&c_addr, &cli_addr.sin_addr.s_addr, sizeof c_addr);
    //printf("0x%08x\n", c_addr);
    CLEAR_BUF(img_buffer);
    FILE* fd = fopen("frame.im", "rb");
    while (1) {
        n = fread(img_buffer, 1, IMG_BUFFER_SIZE, fd);
        send(newsockfd, img_buffer, n, 0);
        printf("%d\n", n);
        if (n < IMG_BUFFER_SIZE) {
            break;
        }
    }
    fclose(fd);
    //nanosleep(&interval, NULL);

    close(newsockfd);
    close(sockfd);
    return 0; 
}
Пример #5
0
SchObj read_obj( SchPort* port ) {
    unsigned int c;

    do {
        c = SCH_GETC(port);
    } while ( ch_class(c) == CL_WHITESPACE );

    if ( c == ((unsigned char)EOF) ) { /* c -> 0x 00 00 00 ff,  EOF -> 0x ff */
        return SCH_EOF;
    }

    CLEAR_BUF(token_buffer_);

    if ( ch_class(c) == CL_DECIMALNUMBER || c == '-' || c == '+') {

        unsigned int c0 = c;

        PUSH_BUF(token_buffer_,c0);
        c = SCH_GETC(port);

        if ( (c0 == '-' || c0 == '+') && (ch_class(c) != CL_DECIMALNUMBER) ) {
            SCH_UNGETC(c,port);
            return SCH_SYMBOL(TO_S_BUF(token_buffer_));
        }

        while ( ch_class(c) & (CL_DECIMALNUMBER) || c == '.' || c == '/' ) {
            PUSH_BUF(token_buffer_,c);
            c = SCH_GETC(port);
        }

        SCH_UNGETC(c,port);

        return read_number(TO_S_BUF(token_buffer_),10);

    } else if ( ch_class(c) == CL_LIST_END ) {

        return SCH_KOKKA;

    } else if ( ch_class(c) == CL_LIST_BEGIN ) {

        SchObj x      = read_obj(port);
        SchObj p_val  = SCH_LIST1(x);
        SchObj p_last = p_val;

        if ( x == SCH_KOKKA ) {
            return SCH_NIL;
        }

        for (;;) {
            x = read_obj( port );
            if ( x == SCH_KOKKA ) {
                return p_val;
            } else if ( x == SCH_DOT || x == SCH_SYMBOL(".") ) {
                SCH_SET_CDR( p_last, read_obj(port) );
                if ( read_obj( port ) != SCH_KOKKA ) {
                    EXCEPTION("right parenthesis ')' missing");
                }
                return p_val;
            } else {
                SchObj p_y = SCH_LIST1(x);
                SCH_SET_CDR(p_last,p_y);
                p_last = p_y;
            }
        }

    } else if ( c == '"' ) {

        unsigned int prev = c;
        while ( (c = SCH_GETC(port)) != '"' || prev == '\\') {
            if ( prev == '\\' ) {
                switch(c) {
                case '"':
                    POP_BUF(token_buffer_);
                    PUSH_BUF(token_buffer_,'\"');
                    break;
                case 'n':
                    POP_BUF(token_buffer_);
                    PUSH_BUF(token_buffer_,'\n');
                    break;
                case 't':
                    POP_BUF(token_buffer_);
                    PUSH_BUF(token_buffer_,'\t');
                    break;
                default:
                    break;
                }
            } else {
                PUSH_BUF(token_buffer_,c);
            }
            prev = c;
        }
        return SCH_STRING(TO_S_BUF(token_buffer_));

    } else if ( c == '\'' ) {

        return SCH_LIST2(SCH_SYMBOL("quote"),read_obj(port));

    } else if ( c == '`' ) {

        return SCH_LIST2( SCH_SYMBOL("quasiquote"), read_obj(port) );

    } else if ( c == ',' ) {

        if ( (c = SCH_GETC(port)) == '@' ) {
            return SCH_LIST2( SCH_SYMBOL("unquote-splicing"), read_obj(port) );
        } else {
            SCH_UNGETC(c,port);
            return SCH_LIST2( SCH_SYMBOL("unquote"), read_obj(port) );
        }

    } else if ( c == ';' ) {

        while ( (c = SCH_GETC(port)) != '\n' ) {
            if (c == (unsigned char)EOF) { return (SchObj)SCH_EOF; }
        }
        return read_obj( port );

    } else if ( c == '#') {
        return read_sharp_sequence(port);
    } else {

        do {
            PUSH_BUF(token_buffer_,c);
            c = SCH_GETC(port);
        } while ( ch_class(c) & (CL_IDENTIFIER|CL_DECIMALNUMBER) );

        SCH_UNGETC(c,port);

        return SCH_SYMBOL(TO_S_BUF(token_buffer_));
    }

}