码迷,mamicode.com
首页 > 系统相关 > 详细

搜狗云输入法移植到linux平台的想法

时间:2014-04-29 13:23:20      阅读:584      评论:0      收藏:0      [点我收藏+]

标签:des   blog   http   os   数据   io   

 在ubuntu9.04的时代,自带的输入法一直认为不够好用,看到了搜狗的云输入法,故产生了移植的想法。

通过chrome的inspect Element功能,我发现了搜狗、百度、QQ云输入法的接口。公布一下,供大家参考。

百度http://olime.baidu.com/py?py=bit&rn=0&pn=5

搜狗http://web.pinyin.sogou.com/api/py?key=938cdfe9e1e39f8dd5da428b1a6a69cb&query=bit

QQhttp://ime.qq.com/fcgi-bin/getword?key=f56b884eebd87625cb4f87fcf125b0db&cb=window.QQWebIME.callback238&q=y

写了一段百度的测试了一下,之后只用正则表达式就好了,因为后来看到google code上面有人开发了基于ibus的搜狗的云输入法,故决定停止开发吧。

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <errno.h> 
  4. #include <string.h> 
  5. #include <netdb.h> 
  6. #include <unistd.h> 
  7. #include <fcntl.h> 
  8. #include <fcntl.h> 
  9. #include <sys/time.h> 
  10. #include <sys/types.h> 
  11. #include <netinet/in.h> 
  12. #include <sys/socket.h> 
  13. #include<iconv.h> 
  14. #define MaxRecvLen  255 
  15.  
  16. //定义网站结构 
  17. struct DOMAIN 
  18. { 
  19.     char url[255];      //完整网址 
  20.     char host[20];      //主机地址 
  21.     int  port;       //sock 联接的端口号 
  22. }; 
  23. typedef struct DOMAIN domain; 
  24.  
  25. //*********************gb2312toutf-8**************** 
  26. int gb2312toutf8(char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen) 
  27. { 
  28.     iconv_t cd; 
  29.     if( (cd = iconv_open("utf-8","gb2312")) ==0 ) 
  30.         return -1; 
  31.     memset(destbuf,0,destlen); 
  32.     char **source = &sourcebuf; 
  33.     char **dest = &destbuf; 
  34.  
  35.     if(-1 == iconv(cd,source,&sourcelen,dest,&destlen)) 
  36.         return -1; 
  37.     iconv_close(cd); 
  38.     return 0; 
  39.  
  40. } 
  41.  
  42. //***********************百度云输入法************************** 
  43. char* Getword(domain web_domain) 
  44. { 
  45.  
  46. //******************* 有关 sock 的变量 ************************* 
  47.  
  48.     int sock_id;       //sock 联接句柄 
  49.  
  50.     struct hostent *hostbyname;    //主机的信息 结构 
  51.     struct sockaddr_in remote_addr;   //包含远端主机IP地址和端口号的结构 
  52.  
  53.  
  54. //******************* 有关 无阻塞 select 所用到 的变量 ************* 
  55.  
  56.     struct timeval timeout;     //用于无阻塞 select 调用 的时间变量 
  57.     fd_set sockid_readable;     //sock 类似联接句柄 传递给 select 有效的连接 
  58.  
  59.  
  60.  
  61.     char send_str[255];      //保存要发送的字符串 
  62.     char temp[2048]; 
  63.     char result[512]; 
  64.     char word[2048]; 
  65.     char *recBuf;     //临时字串,接收到的字串指针 
  66.  
  67.     int recv_numb;       //保存远端返回的字串大小 
  68.  
  69.     timeout.tv_sec = 10;      //设置几秒钟超时 
  70.     timeout.tv_usec = 5000;    //设置几微秒超时 
  71.  
  72. //******************* 处理命令行的参数 ************************* 
  73.  
  74.  
  75.  
  76.     hostbyname = gethostbyname(web_domain.host);  //将基本名字和地址转换 
  77.     if((sock_id=socket(PF_INET,SOCK_STREAM,0))==-1) 
  78.     { 
  79.         perror("socket"); 
  80.         exit(1); 
  81.     } 
  82.  
  83. //初始化远端要传递的socket 
  84.     remote_addr.sin_family=AF_INET;      //地址族 
  85.     remote_addr.sin_port=htons(web_domain.port);  //端口号 
  86.     remote_addr.sin_addr=*((struct in_addr *)hostbyname->h_addr);  //IP地址 
  87.     bzero(&(remote_addr.sin_zero),8);     //填充0 以保持与struct sockaddr同样大小 
  88.  
  89. //和服务器建立连接 
  90.     if(connect(sock_id,(struct sockaddr *)&remote_addr,sizeof(remote_addr))==-1) 
  91.     { 
  92.         perror("connect"); 
  93.         exit(1); 
  94.     } 
  95.     //printf("\n\nconnected %s:%d ok!\n\n",web_domain.host,web_domain.port); 
  96.  
  97. //创建要发送给远端的字串 
  98.     sprintf(send_str,"GET %s HTTP/1.1\nAccept: */*\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\nHost: %s\n\n",web_domain.url,web_domain.host); 
  99.     //printf("%s\n\n",send_str); 
  100. //开始向服务器发送数据 
  101.     if(send(sock_id,send_str,strlen(send_str),0)==-1) 
  102.     { 
  103.         perror("send"); 
  104.         exit(1); 
  105.     } 
  106.     recBuf=(char *)malloc(MaxRecvLen);  //为储存远端返回的字串的变量申请空间 
  107.  
  108.     while(1) 
  109.     { 
  110.  
  111. //设置无堵塞模式 
  112.         FD_ZERO(&sockid_readable); 
  113.         FD_SET(sock_id,&sockid_readable); 
  114.         select(sock_id+1, &sockid_readable, NULL, NULL, &timeout); 
  115.         if (!FD_ISSET(sock_id, &sockid_readable)) 
  116.         { 
  117.             printf("Timed out.\n"); 
  118.             //break; 
  119.         } 
  120.         recv_numb = recv(sock_id,recBuf,MaxRecvLen,0); //得到远端返回的字串 
  121.         recBuf[recv_numb]=‘\0‘; 
  122.  
  123.  
  124.         gb2312toutf8(recBuf,strlen(recBuf),result,512); 
  125.  
  126.         strcat(temp,result); 
  127.         if(recv_numb<1)  //返回的长度不够退出循环 
  128.         { 
  129.             break; 
  130.         } 
  131.     } 
  132.  
  133.     //printf("\n\nrecv  ok!\n\n"); 
  134.     close(sock_id); 
  135.     strcpy(word,temp+190); 
  136.     return word; 
  137. } 
  138.  
  139. int main(int argc,char *argv[]) 
  140. { 
  141.     char tempStr[255],*temp; 
  142.     domain web_domain;      //定义一个 web domain 的结构 
  143.     strcpy(tempStr,"http://olime.baidu.com/py?pn=10&py="); 
  144.     strcat(tempStr,argv[1]); 
  145.     strcat(tempStr,"&rn="); 
  146.     strcat(tempStr,argv[2]); 
  147.     strcpy(web_domain.url,tempStr); 
  148.     strcpy(web_domain.host,web_domain.url+7); 
  149.  
  150. //处理 host 
  151.     if((temp=strstr(web_domain.host,"/"))) 
  152.     { 
  153.         *temp=‘\0‘;         //web_domain.host 里去除:后的东西 
  154.     } 
  155.     if((temp=strstr(web_domain.host,":"))) 
  156.     { 
  157.  
  158.         *temp=‘\0‘;         //Host 里去除:后的东西 
  159.         web_domain.port=atoi(tempStr+1);    //改写端口 
  160.     } 
  161.     else 
  162.     { 
  163.         web_domain.port=80; 
  164.     } 
  165.  
  166.     //printf("%s\n%d\n%s\n",web_domain.host,web_domain.port,web_domain.url); 
  167.     printf("%s\n",Getword(web_domain)); 
  168.     return 0; 
  169. } 

 

本文出自 “天才鸟蛋” 博客,请务必保留此出处http://curley.blog.51cto.com/1627940/449044

搜狗云输入法移植到linux平台的想法,码迷,mamicode.com

搜狗云输入法移植到linux平台的想法

标签:des   blog   http   os   数据   io   

原文地址:http://blog.csdn.net/curley/article/details/24692837

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!