findcp.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:5k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19.  
  20. #include "findcp.h"
  21. list<IPInfo> ipinfo_list;
  22. list<struct MySession> sessioninfo_list;
  23. #ifdef __cplusplus
  24. extern "C"{
  25. #endif
  26. int init()
  27. {
  28. int ret = readconfig("ip.list");
  29. return ret;
  30. }
  31. int readconfig(char * _filename)
  32. {
  33. if(_filename == NULL)
  34. return -1;
  35. string filename = string(_filename);
  36. ifstream file(filename.c_str());
  37. string line;
  38. while(1)
  39. {
  40. getline(file, line, 'n');
  41. if(strlen(line.c_str()) == 0 || strcmp(line.c_str(), "r") == 0)
  42. {
  43. break;
  44. }
  45. IPInfo ipinfo;
  46. int pos = line.find("/", 0);
  47. int blank = line.find(" ", 0);
  48. ipinfo.mask = atoi(line.substr(pos+1, blank).c_str());
  49. ipinfo.ipaddr = ntohl(inet_addr(line.substr(0, pos).c_str())) >> ipinfo.mask;
  50. ipinfo.nettype = line.substr(blank+1, strlen(line.c_str())-blank-1);
  51. if(ipinfo_list.size() == 0)
  52. {
  53. ipinfo_list.push_back(ipinfo);
  54. continue;
  55. }
  56. list<IPInfo>::iterator iter = ipinfo_list.begin();
  57. for(; iter != ipinfo_list.end(); iter ++)
  58. {
  59. if(ipinfo.ipaddr < (*iter).ipaddr)
  60. {
  61. ipinfo_list.insert(iter, ipinfo);
  62. break;
  63. }
  64. }
  65. if(iter == ipinfo_list.end())
  66. ipinfo_list.push_back(ipinfo);
  67. }
  68. if(ipinfo_list.size() == 0)
  69. return -1;
  70. return 0;
  71. }
  72. const char* find_cp_service_type(unsigned long ip)
  73. {
  74. const char * retchar = find_ip_from_list(ip);
  75. if(retchar == NULL)
  76. {
  77. PDEBUG("find_cp_service_type: Cant find cp service type. ip=%ld ret=%sn",ip,retchar);
  78. return NULL;
  79. }
  80. string servicetype = string(retchar);
  81. int pos = servicetype.rfind(".");
  82. if(pos != -1)
  83. servicetype = servicetype.substr(pos+1, servicetype.length()-pos-1);
  84. PDEBUG("find_cp_service_type: return %sn", servicetype.c_str());
  85. return servicetype.c_str();
  86. }
  87. const char* find_ip_from_list(unsigned long ip)
  88. {
  89. // PDEBUG("in find_ip_from_listn");
  90. unsigned long ipaddr = ip;
  91. // unsigned long ipaddr = htonl(inet_addr(ip.c_str()));
  92. for(list<IPInfo>::iterator iter = ipinfo_list.begin(); iter != ipinfo_list.end(); iter ++)
  93. {
  94. unsigned long ipcode = ipaddr >> (*iter).mask;
  95. // PDEBUG("ip: %ld mask: %d result: %ldn", ip, (*iter).mask, ipcode);
  96. if(ipcode == (*iter).ipaddr)
  97. {
  98. return (*iter).nettype.c_str();
  99. }
  100. }
  101. return NULL;
  102. }
  103. int findcppeers(unsigned long ip, void * _p)
  104. {
  105. MySession *p = (MySession*)_p;
  106. const char * retchar = find_ip_from_list(ip);
  107. if(retchar == NULL)
  108. {
  109. PDEBUG("findcppeers: Cant find cp service type. ip=%ld ret=%sn", ip, retchar);
  110. return -1;
  111. }
  112. else
  113. {
  114. PDEBUG("findcppeers: found %sn", retchar);
  115. }
  116. string nettype = string(retchar);
  117. int pos = 0;
  118. bool bfound = 0;
  119. if(strlen(p->u.cp.servicetype) == 0)
  120. return -1;
  121. return findnettype(nettype.c_str(), p);
  122. }
  123. int findnettype(const char* _nettype, void *_p)
  124. {
  125. MySession *p = (MySession*)_p;
  126. if(_nettype == NULL)
  127. return -1;
  128. string nettype = string(_nettype);
  129. int minpriority = 100;
  130. //check if the cp serves the given nettype
  131. string servicetype = string(p->u.cp.servicetype);
  132. int pos = servicetype.find(nettype);
  133. if(pos == -1)
  134. return -1;
  135.     
  136.     if(p->u.cp.maxConn == 1 || p->socket == 0)//无效的CP
  137. return -1;
  138. int priority = 0;
  139. pos = 0;
  140. //deal with priority
  141. while(pos != -1)
  142. {
  143. priority ++;//sequence in servicetype string
  144. int dotpos = servicetype.find(".", pos);
  145. string temp = servicetype.substr(pos, dotpos - pos);
  146. if(strcmp(temp.c_str(), nettype.c_str()) == 0)
  147. break;
  148. pos = servicetype.find(nettype, dotpos);
  149. }
  150. return priority;
  151. }
  152. void add_cp_to_list(void *_p)
  153. {
  154. MySession *p = (MySession *)_p;
  155. sessioninfo_list.push_back(*p);
  156. }
  157. void remove_cp_from_list(void *_p)
  158. {
  159. MySession *p = (MySession*)_p;
  160. list<MySession>::iterator iter = sessioninfo_list.begin();
  161. for(; iter != sessioninfo_list.end(); iter++)
  162. {
  163. if(static_cast<MySession>(*iter).host == p->host)
  164. {
  165. sessioninfo_list.erase(iter);
  166. //sessioninfo_list.remove(static_cast<CPInfo>(*iter));
  167. break;
  168. }
  169. }
  170. }
  171. #ifdef __cplusplus
  172. }
  173. #endif