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

📄 http.c

📁 xmms-1.2.10.tar.gz学习使用的就下吧
💻 C
字号:
/* *  http.c *  Some simple routines for connecting to a remote tcp socket *  Copyright 1999 H鍁ard Kv錶en <havardk@sol.no> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* FIXME: We need to have *one* place in xmms where you configure proxies */#include "http.h"gint http_open_connection(gchar * server, gint port){	gint sock;#ifdef USE_IPV6	struct addrinfo hints, *res, *res0;	char service[6];#else	struct hostent *host;	struct sockaddr_in address;#endif#ifdef USE_IPV6	g_snprintf(service, 6, "%d", port);	memset(&hints, 0, sizeof(hints));	hints.ai_socktype = SOCK_STREAM;	if (getaddrinfo(server, service, &hints, &res0))		return 0;	for (res = res0; res; res = res->ai_next) {		sock = socket (res->ai_family, res->ai_socktype, res->ai_protocol);		if (sock < 0) {			if (res->ai_next)				continue;			else {				freeaddrinfo(res0);				return 0;			}		}		if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) {			if (res->ai_next) {				close(sock);				continue;			} else {				freeaddrinfo(res0);				return 0;			}		}		freeaddrinfo(res0);		return sock;	}#else	sock = socket(AF_INET, SOCK_STREAM, 0);	address.sin_family = AF_INET;	if (!(host = gethostbyname(server)))		return 0;	memcpy(&address.sin_addr.s_addr, *(host->h_addr_list), sizeof(address.sin_addr.s_addr));	address.sin_port = g_htons(port);	if (connect(sock, (struct sockaddr *) &address, sizeof (struct sockaddr_in)) == -1)		return 0;#endif	return sock;}void http_close_connection(gint sock){	shutdown(sock, 2);	close(sock);}gint http_read_line(gint sock, gchar * buf, gint size){	gint i = 0;	while (i < size - 1)	{		if (read(sock, buf + i, 1) <= 0)		{			if (i == 0)				return -1;			else				break;		}		if (buf[i] == '\n')			break;		if (buf[i] != '\r')			i++;	}	buf[i] = '\0';	return i;}gint http_read_first_line(gint sock, gchar * buf, gint size){	/* Skips the HTTP-header, if there is one, and reads the first line into buf.	   Returns number of bytes read. */		gint i;	/* Skip the HTTP-header */	if ((i = http_read_line(sock, buf, size)) < 0)		return -1;	if (!strncmp(buf, "HTTP", 4)) /* Check to make sure its not HTTP/0.9 */	{		while (http_read_line(sock, buf, size) > 0)			/* nothing */;		if ((i = http_read_line(sock, buf, size)) < 0)			return -1;	}		return i;}gchar * http_get(gchar * url){	gchar *server, *getstr, *buf = NULL, *bptr;	gchar *gs, *gc, *turl = url;	gint sock, n, bsize, port = 0;	/* Skip past ``http://'' part of URL */	if ( !strncmp(turl, "http:", 5) ) {		turl += 5;		if ( !strncmp(turl, "//", 2) )			turl += 2;	}	/* If path starts with a '/', we are referring to localhost */	if ( turl[0] == '/' )		server = "localhost";	else		server = turl;	/* Check if URL contains port specification */	gc = strchr(turl, ':');	gs = strchr(turl, '/');	if ( gc != NULL && gc < gs ) {		port = atoi(gc+1);		*gc = '\0';	}	if ( port == 0 )		port = 80;	/* Make sure that server string is null terminated. */	if ( gs )		*gs = '\0';	/*	 * Now, open connection to server.	 */	sock = http_open_connection(server, port);	/* Repair the URL string that we broke earlier on */	if ( gs )		*gs = '/';	if ( gc && gc == '\0' )		*gc = ':';	if ( sock == 0 )		return NULL;	/*	 * Send query to socket.	 */	getstr = g_strdup_printf("GET %s HTTP/1.0\r\n\r\n", gs ? gs : "/");/*  	getstr = g_strdup_printf("GET %s HTTP/1.0\r\n\r\n", url ? url : "/"); */	if ( write(sock, getstr, strlen(getstr)) == -1 ) {		http_close_connection(sock);		return NULL;	}		/*	 * Start receiving result.	 */	bsize = 4096;	bptr = buf = g_malloc(bsize);	if ( (n = http_read_first_line(sock, bptr, bsize)) == -1 ) {		g_free(buf);		buf = NULL;		goto Done;	}	bsize -= n;	bptr += n;	while (bsize > 0 && (n = http_read_line(sock, bptr, bsize)) != -1) {		bptr += n;		bsize -= n;	} Done:	http_close_connection(sock);	/*	 * Return result buffer to caller.	 */	return buf;}

⌨️ 快捷键说明

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