⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtsp_resp.c

📁 嵌入式系统中c程序实现了rtsp协议的基本内容
💻 C
📖 第 1 页 / 共 2 页
字号:
			return;
		}
		ix++;
	}
	
	if (*last_number >= 0 && isspace(*lptr)) {
		/*asdf*/
		ADV_SPACE(lptr);
		(header_types[*last_number].parse_routine)(lptr, info->decode_response, 1);
		Rtsp_Printf("come to successfull\n");
	} 
	else
	{
		Rtsp_Printf( "Not processing response header: %s\n", lptr);
	}
}
static int rtsp_read_into_buffer (rtsp_client_t *cptr,
								  uint32_t buffer_offset,
								  int wait)
{
	int ret;
	
	ret = rtsp_receive_socket(cptr,
		cptr->m_resp_buffer + buffer_offset,
		RECV_BUFF_DEFAULT_LEN - buffer_offset,
		cptr->recv_timeout, 
		wait);
	
	if (ret <= 0) return (ret);
	
	cptr->m_buffer_len = buffer_offset + ret;
	cptr->m_resp_buffer[cptr->m_buffer_len] = '\0';
	
	return ret;
}

int rtsp_bytes_in_buffer (rtsp_client_t *cptr)
{
	return (cptr->m_buffer_len - cptr->m_offset_on);
}

int rtsp_recv (rtsp_client_t *cptr,
			   char *buffer,
			   uint32_t len)
{
	uint32_t mlen;
	int copied, result;
	
	copied = 0;
	if (cptr->m_offset_on < cptr->m_buffer_len) {
		mlen =  MIN(len, cptr->m_buffer_len - cptr->m_offset_on);
		memmove(buffer,
			&cptr->m_resp_buffer[cptr->m_offset_on],
			mlen);
		cptr->m_offset_on += mlen;
		len -= mlen;
		copied += mlen;
	}
	if (len > 0) {
		result = rtsp_receive_socket(cptr,
			buffer + copied,
			len,
			0,
			0);
		if (result >= 0) {
			copied += result;
		}
	}
	return copied;
}


static int rtsp_save_and_read (rtsp_client_t *cptr)
{
	int last_on;
	int ret;
	cptr->m_buffer_len -= cptr->m_offset_on;
	if (cptr->m_buffer_len >= RECV_BUFF_DEFAULT_LEN) {
		return 0;
	} else if (cptr->m_buffer_len != 0) {
		memmove(cptr->m_resp_buffer,
			&cptr->m_resp_buffer[cptr->m_offset_on],
			cptr->m_buffer_len);
		last_on = cptr->m_buffer_len;
	} else {
		last_on = 0;
	}
	
	cptr->m_offset_on = 0;  
	ret = rtsp_read_into_buffer(cptr, cptr->m_buffer_len, 0);
	if (ret > 0) {
		last_on += ret;
	}
	return (last_on);
}

static const char *rtsp_get_next_line (rtsp_client_t *cptr,
									   const char *seperator)
{
	int ret;
	int last_on;
	char *sep;
	
	/*
	* If we don't have any data, try to read a buffer full
	*/
	if (cptr->m_buffer_len == 0) {
		cptr->m_offset_on = 0;
		ret = rtsp_read_into_buffer(cptr, 0, 1);
		if (ret <= 0) {
			return (NULL);
		}
	}
	
	/*
	* Look for CR/LF in the buffer.  If we find it, NULL terminate at
	* the CR, then set the buffer values to look past the crlf
	*/
	sep = strstr(&cptr->m_resp_buffer[cptr->m_offset_on],
	       seperator);
	if (sep != NULL) {
		const char *retval = &cptr->m_resp_buffer[cptr->m_offset_on];
		cptr->m_offset_on = sep - cptr->m_resp_buffer;
		cptr->m_offset_on += strlen(seperator);
		*sep = '\0';
		return (retval);
	}
	
	if (cptr->m_offset_on == 0) {
		return (NULL);
	}
	
	/*
	* We don't have a line.  So, move the data down in the buffer, then
	* read into the rest of the buffer
	*/
	last_on = rtsp_save_and_read(cptr);
	if (last_on < 0) return (NULL);
	/*
	* Continue searching through the buffer.  If we get this far, we've
	* received like 2K or 4K without a CRLF - most likely a bad response
	*/
	sep = strstr(&cptr->m_resp_buffer[last_on],
	       seperator);
	if (sep != NULL) {
		const char *retval = &cptr->m_resp_buffer[cptr->m_offset_on];
		cptr->m_offset_on = sep - cptr->m_resp_buffer;
		cptr->m_offset_on += strlen(seperator);
		*sep = '\0';
		return (retval);
	}
	return (NULL);
}
/*
* rtsp_parse_response - parse out response headers lines.  Figure out
* where seperators are, then use them to determine where the body is
*/
static int rtsp_parse_response (rtsp_client_t *info)
{
	const char *seperator;
	const char *lptr, *p;
	rtsp_decode_t *decode;
	int ret, done;
	int last_header = -1;
	uint32_t len;
	
	decode = info->decode_response;
	
	/* Figure out what seperator is being used throughout the response*/
	ret = rtsp_save_and_read(info);
	if (ret < 0) 
	{
		return (RTSP_RESPONSE_RECV_ERROR);
	}
	
	seperator = find_seperator(info->m_resp_buffer);
	if (seperator == NULL) 
	{
		Rtsp_Printf( "Could not find seperator in header\n");
		return RTSP_RESPONSE_MALFORM_HEADER;
	}
	
	/*rtsp_debug(LOG_DEBUG, "Response buffer:\n%s", info->m_resp_buffer);*/
	
	do {
		lptr = rtsp_get_next_line(info, seperator);
		if (lptr == NULL) {
			Rtsp_Printf( "Couldn't get next line\n");
			return (RTSP_RESPONSE_MALFORM_HEADER);
		}
	} while (*lptr == '\0');
	
	/* Rtsp_Printf( "%s\n",lptr);
	*/
	if (strncasecmp(lptr, "RTSP/1.0", strlen("RTSP/1.0")) != 0) {
		Rtsp_Printf( "RTSP/1.0 not found\n");
		return RTSP_RESPONSE_MALFORM_HEADER;
	}
	p = lptr + strlen("RTSP/1.0\n");
	ADV_SPACE(p);
	memcpy(decode->retcode, p, 3);
	decode->retcode[3] = '\0';
	
	switch (*p) {
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
		break;
	default:
		Rtsp_Printf( "Bad error code %s\n", p);
		return RTSP_RESPONSE_MALFORM_HEADER;
	}
	p += 3;
	ADV_SPACE(p);
	if (p != '\0') {
		decode->retresp = strdup(p);
	}
	/* Rtsp_Printf( "Decoded status - code %s %s\n",
	decode->retcode, decode->retresp);
	*/	     
	done = 0;
	do {
		lptr = rtsp_get_next_line(info, seperator);
		
		if (lptr == NULL) {
			return (RTSP_RESPONSE_MALFORM_HEADER);
		}
		if (*lptr == '\0') {
			done = 1;
		} else {
		/*     Rtsp_Printf( "%s\n",lptr);
			*/
			rtsp_decode_header(lptr, info, &last_header);
		}
	} while (done == 0);
	
	if (decode->content_length != 0) {
	/*   Rtsp_Printf( "reading content length %d\n", decode->content_length);
		*/
		decode->body = (char*)Rtsp_Malloc(decode->content_length + 1,__LINE__,__FILE__);
		decode->body[decode->content_length] = '\0';
		len = info->m_buffer_len - info->m_offset_on;
		/*   Rtsp_Printf( "Copied %d bytes from buffer\n", len);
		*/
		if (len < decode->content_length) {
			/* not enough in memory - need to read*/
			memcpy(decode->body,
				&info->m_resp_buffer[info->m_offset_on],
				len);
			while (len < decode->content_length) {
				int left;
				ret = rtsp_read_into_buffer(info, 0, 1);
				
				if (ret <= 0) {
					Rtsp_Printf( "Returned from rtsp_read_into_buffer - error %d\n", 
						ret);
					return (-1);
				}
				left = decode->content_length - len;
				if (left < info->m_buffer_len) {
					/* we have more data in the buffer then we need*/
					memcpy(decode->body + len,
						info->m_resp_buffer,
						left);
					len += left;
					info->m_offset_on = left;
				} else {
					/* exact or less - we're cool*/
					memcpy(decode->body + len,
						info->m_resp_buffer,
						info->m_buffer_len);
					len += info->m_buffer_len;
					info->m_offset_on = info->m_buffer_len; /* get ready for next...*/
				}
			}
		} else {
			/* Plenty in memory - copy it, continue to end...*/
			memcpy(decode->body,
				&info->m_resp_buffer[info->m_offset_on],
				decode->content_length);
			info->m_offset_on += decode->content_length;
		}
	} else if (decode->close_connection) {
		/* No termination - just deal with what we've got...*/
		len = info->m_buffer_len - info->m_offset_on;
		decode->body = (char *)Rtsp_Malloc(len + 1,__LINE__,__FILE__);
		memcpy(decode->body,
			&info->m_resp_buffer[info->m_offset_on],
			len);
		decode->body[len] = '\0';
	}
	/*if (decode->body != NULL)*/
	/*{
	int tocopy2=0;
	while( len > 0)
	{
	U32 tmp=0;
	tmp = NG_MIN( len, 250);
	memcpy(decode->body+tocopy2,
	info->m_resp_buffer + info->m_offset_on +tocopy2,
	tmp);
	decode->body[tocopy2+tmp] = '\0';
	Rtsp_Printf("%s",decode->body+tocopy2);
	len-=tmp;
	tocopy2+=tmp;
	}
    }*/
	return (0);
}

/*
* rtsp_get_response - wait for a complete response.  Interesting that
* it could be in multiple packets, so deal with that.
*/
int rtsp_get_response (rtsp_client_t*info)
{
	int ret;
	rtsp_decode_t *decode;
	int response_okay;
	
	while (1) 
	{
		/* In case we didn't get a response that we wanted.*/
		if (info->decode_response != NULL) 
		{
			clear_decode_response(info->decode_response);
			decode = info->decode_response;
		} 
		else 
		{
			decode = info->decode_response =(rtsp_decode_t*)Rtsp_Malloc(sizeof(rtsp_decode_t),__LINE__,__FILE__);
			if (decode == NULL) 
			{
				Rtsp_Printf( "Couldn't create decode response\n");
				return (RTSP_RESPONSE_RECV_ERROR);
			}
		}
		
		memset(decode, 0, sizeof(rtsp_decode_t));
		
		do {
			/* Parse response.*/
			ret = rtsp_parse_response(info);
			Rtsp_Printf( "parsed response - len %d offset %d\n",
				info->m_buffer_len, info->m_offset_on);
			
			if (ret != 0) 
			{
				/*	if (info->thread == NULL)*/
				rtsp_close_socket(info);
				Rtsp_Printf( "return code %d from rtsp_parse_response\n", ret);
				return (RTSP_RESPONSE_RECV_ERROR);
			} 
			
			if (decode->close_connection) 
			{
				Rtsp_Printf("Response requested connection close\n");
				
				rtsp_close_socket(info);
			}
			
			response_okay = TRUE;
			/* Okay - we have a good response. - check the cseq, and return*/
			/* the correct error code.*/
			if (info->next_cseq == decode->cseq) {
				info->next_cseq++;
				if ((decode->retcode[0] == '4') ||
					(decode->retcode[0] == '5')) 
				{
					Rtsp_Printf("decode->retcode[0] == %c\n",decode->retcode[0]);
					return (RTSP_RESPONSE_BAD);
				}
				if (decode->cookie != NULL) {
					/* move cookie to rtsp_client*/
					info->cookie = strdup(decode->cookie);
				}
				if (decode->retcode[0] == '2') {
					return (RTSP_RESPONSE_GOOD);
				}
				if (decode->retcode[0] == '3') {
					if (decode->location == NULL) {
						return (RTSP_RESPONSE_BAD);
					}
					if (rtsp_setup_redirect(info) != 0) {
						return (RTSP_RESPONSE_BAD);
					}
					return (RTSP_RESPONSE_REDIRECT);
				}
			}

		} while (info->m_buffer_len != 0);
	} 
	return (RTSP_RESPONSE_RECV_ERROR);
}

/* end file rtsp_resp.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -