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; }
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; }
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_; }
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; }
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_)); } }