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

📄 http.c

📁 uclinux下s3c4510B CPU播放mp3 C程序
💻 C
字号:
/****************************************************************************//* *	http.c -- get MP3 data from a http address. * *	(C) Copyright 1999, Greg Ungerer (gerg@snapgear.com) *//****************************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>/****************************************************************************//* *	Indicate whether we are streaming or not */extern int	http_streaming;/****************************************************************************/int httpreadline(int fd, char *buf, int len){	char	c;	int	size;	for (len--, size = 0; (size < len); size++) {		if (read(fd, &c, sizeof(c)) != sizeof(c))			break;		if (c == '\n')			break;		*buf++ = c;	}	*buf = 0;	return(size);}/****************************************************************************/int openhttp(char *url){	struct sockaddr_in	sin;	struct hostent		*hp;	char			*up, *sp;	char			urlip[256];	char			urlport[32];	char			urlfile[256];	char			buf[256];	char			relocurl[512];	int			fd, portnr, n, relocated;	fd = -1;	portnr = 80;	up = url;	do {		/* Strip http protocol name from url */		if (strncmp(up, "http://", 7) == 0)				up += 7;		/* Get system name (or IP address) from url */		for (sp = &urlip[0]; ((*up != ':') && (*up != '/')); up++) {			if (*up == 0)				return(-1);			*sp++ = *up;			if (sp >= &urlip[sizeof(urlip)-1])				return(-1);		}		*sp = 0;		/* Get port number if supplied */		if (*up == ':') {			for (up++, sp = &urlport[0]; (*up != 0); up++) {				if (*up == '/')					break;				*sp++ = *up;				if (sp >= &urlport[sizeof(urlport)-1])					return(-1);			}			*sp = 0;			portnr = atoi(urlport);		}		/* Get file path */		for (sp = &urlfile[0]; (*up != 0); up++) {			*sp++ = *up;			if (sp >= &urlfile[sizeof(urlfile)-1])				return(-1);		}		*sp = 0;		/* Mark whether we are streaming or not... */		if (urlfile[0] == 0)			http_streaming++;		if ((hp = gethostbyname(urlip))) {			sin.sin_family = hp->h_addrtype;			memcpy(&sin.sin_addr, hp->h_addr, hp->h_length);		} else {			sin.sin_family = AF_INET;			sin.sin_addr.s_addr = inet_addr(urlip);		}		sin.sin_port = htons(portnr);		/* Open socket to IP address */		if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)			return(-1);		if (connect(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0)			return(-1);		/* Send GET request to server */		sprintf(buf, "GET %s HTTP/1.0\r\n"			"User-Agent: mp3play/100\r\n"			"Accept: audio/mpeg, audio/x-mpegurl, */*\r\n"			"\r\n",			urlfile);		if (write(fd, buf, strlen(buf)) < 0)			return(-1);		if (httpreadline(fd, buf, sizeof(buf)) < 0)			return(-1);		relocated = 0;		if ((sp = strchr(buf, ' '))) {			switch (sp[1]) {			case '3':				relocated++;				break;			case '2':				break;			default:				return(-1);			}		}		for (;;) {			if (httpreadline(fd, buf, sizeof(buf)) < 0)				return(-1);			if ((buf[0] == '\n') || (buf[0] == '\r'))				break;			if (strncmp(buf, "Location:", 9) == 0) {				strncpy(relocurl, buf+10, sizeof(relocurl));				up = relocurl;			}		}	} while (relocated);	return(fd);}/****************************************************************************/

⌨️ 快捷键说明

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