socket编程--搜索百度歌曲
刚看到一篇关于百度音乐接口的文章:
http://blog.csdn.net/wangjintao1988/article/details/8003573,这个里面说明了实现思路,并且编码方式的转换是基于Java的。最近正在学习linux socket编程,因此想通过linux实现这个功能,字体编码从GB2312到ASCII字符的转换时曾经尝试用iconv,但一直无法正确转换,自己写了一个函数。
这个code如下:down.c
<pre class="cpp" name="code">#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/socket.h>
#include <iconv.h>
#define MAX_SIZE 1024
#define SEVER_PORT 80
/*
*将GB3212格式转换为ASCII字符,并且在其中插入服务器需要的%
*/
int zh2b(char *inbuf,int inbytes,char *outbuf,int outbytes)
{int len = 0;char ch[8];int i;printf("\n===========ascii===========\n");for(i=0;i<inbytes;i++){sprintf(ch,"%0x",inbuf[i]);outbuf[len++] = '%';outbuf[len++] = ch[6];outbuf[len++] = ch[7];}outbuf[len] = '\0';for(i=0;i<len;i++){if(outbuf[i]>='a'&&outbuf[i]<='z')outbuf[i] -= 32;}printf("\n===============end================\n");printf("%s\n",outbuf);
}
/*
* 向服务器发送的GET请求
*/
void obtion_head_msg(const char *music,const char *artist,char *head_msg)
{sprintf(head_msg,"GET /x?op=12&count=1&title=");strcat(head_msg,music);strcat(head_msg,"$$");strcat(head_msg,artist);strcat(head_msg,"$$$$");strcat(head_msg," HTTP/1.1\n");strcat(head_msg,"Host: box.zhangmen.baidu.com\n");strcat(head_msg,"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0\n");strcat(head_msg,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n");strcat(head_msg,"Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\n");strcat(head_msg,"Accept-Encoding: gzip, deflate\n");strcat(head_msg,"Connection:close\n\n");}
int main(int argc,char* argv[])
{int sockfd,numbytes;char buf[MAX_SIZE];struct hostent *h;char requestMsg[MAX_SIZE]={'\n'};char music[64];char artist[64];int music_len=64;int artist_len=64;struct sockaddr_in sever_addr;if(argc != 3){fprintf(stderr,"please input music info:example\n\n ./down music artist \n\n");exit(1);}zh2b(argv[1],strlen(argv[1]),music,music_len);zh2b(argv[2],strlen(argv[2]),artist,artist_len);printf("before:music:%s,artist:%s\n",argv[1],argv[2]);printf("after: music:%s,artist:%s\n",music,artist);if((h=gethostbyname("box.zhangmen.baidu.com")) == NULL){herror("gethostbyname");exit(1);}printf("Host name :%s\n",h->h_name);printf("IP Address:%s",inet_ntoa(*((struct in_addr *)h->h_addr)));
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket error\n");goto ERROR_;}sever_addr.sin_family = AF_INET;sever_addr.sin_port = htons(SEVER_PORT);sever_addr.sin_addr = *((struct in_addr *)h->h_addr);bzero(&(sever_addr.sin_zero),8);if(connect(sockfd,(struct sockaddr *)&sever_addr,sizeof(struct sockaddr)) == -1){perror("connect error \n");goto ERROR_;}obtion_head_msg(music,artist,requestMsg);printf("%s\n",requestMsg);if(send(sockfd,requestMsg,strlen(requestMsg),0)==-1){perror("send error \n");goto ERROR_;}numbytes = recv(sockfd,buf,MAX_SIZE,0);if(numbytes == -1){perror("recv error\n");goto ERROR_;}printf("\n\n=============================start html=======================\n\n");while(numbytes > 0){printf("%s",buf);numbytes = recv(sockfd,buf,MAX_SIZE,0);}printf("\n\n=============================end html=======================\n\n");return 0;
ERROR_:exit(1);}
之后编译:gcc -o down down.c
./down 童话 光良
便可以下载百度服务器发送过来的html,可以根据其中的内容结合这篇文档http://blog.csdn.net/wangjintao1988/article/details/8003573,进行解析出歌曲的下载路径,然后再次用socket或者其他编程方式下载。
注意事项
1.服务器GET请求中,汉字必须转化为ASCII字符并且用%隔开,如:童话(%E7%AB%A5%E8%AF%9D),光良(%E5%85%89%E8%89%AF),括号中是服务器识别的格式
2.GET请求的格式:
GET /x?op=12&count=1&title=%E7%AB%A5%E8%AF%9D$$%E5%85%89%E8%89%AF$$$$ HTTP/1.1
Host: box.zhangmen.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection:close
这个可以在火狐浏览器中通过firebug插件查看你发送的GET请求,如下图:输入http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E7%AB%A5%E8%AF%9D$$%E5%85%89%E8%89%AF$$$$
socket编程--搜索百度歌曲相关推荐
- C# socket编程实践——支持广播的简单socket服务器
在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...
- python封装api linux_python Socket编程-python API 与 Linux Socket API之间的关系
python socket编程 by SA19225409 地址协议家族 Python 支持 AF_UNIX. AF_NETLINK. AF_TIPC 和 AF_INET 家族 AF_UNIX 基于本 ...
- c语言soket编程,C语言socket编程使用方法
C语言socket编程使用方法 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.以 ...
- PHP SOCKET编程详解
这篇文章主要介绍了PHP SOCKET编程详解,需要的朋友可以参考下 1. 预备知识 一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实 ...
- Socket编程知识必学/SELECT 编程
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...
- 网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页
本文为学习笔记,整合课程内容以及下列文章: 其中,libcurl函数库常用字段解读部分: 参考博文:原文地址 作者:冬冬他哥哥 目录 Libcurl库简介 Libcurl等三方库的通用编译方法 三方库 ...
- socket编程简单Demo讲解及源码分享(C# Winform 内网)
首先是什么是socket编程? 推荐大家看百度百科的解释:https://baike.baidu.com/item/socket/281150?fr=aladdin 百科对于定义讲的很详细,就不再叙述 ...
- 网络编程之 socket编程
socket编程(基于linux下的网络编程) 提起网络编程那么我们就不得不说一下socket编程了(本博客主要是围绕下面这本书展开的). 感谢bingo大佬提供的书籍 链接: https://pan ...
- java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)
开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户 ...
最新文章
- Linux 常用命令使用方法
- [云炬创业基础笔记]第二章创业者测试24
- android 升级带服务端,安卓应用升级服务端设计思路
- 30个Python极简代码,10分钟get常用技巧!
- P2906 [USACO08OPEN]Cow Neighborhoods G 切比雪夫距离 + 并查集 + set
- php study是什么,phpstudy与wamp区别的区别是什么?
- 软件版本号命名规范_如何才能给文件合理命名,提高工作效率?我有3个建议!...
- Vista工具箱 v3.1
- AndroidStudio打包生成apk
- Android:获取最近打开app列表
- 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用...
- SSO之CAS+LDAP实现单点登录认证
- CBV-2-CBV流程-view源码解析-面向对象-继承
- Visual Studio 2008操作技巧
- APP性能测试之功耗测试
- 关于 Unity 绑定手机 收不到验证码 的解决方案
- 企业如何软件商业化? .
- 丹佛大学计算机专业,丹佛大学计算机工程排名第81(2018年TFE美国排名)
- 著名专家托马斯·拉姆什评孙宇晨出任格林纳达常驻WTO代表
- 使用腾讯云搭建一个专属自己的网络笔记本(Leanote)