PageRenderTime 38ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/test_ump/test_ump.c

https://github.com/edwardbadboy/user-message-protocol
C | 307 lines | 248 code | 28 blank | 31 comment | 24 complexity | 3c882abb1db37fa634b17a4cf3a4343e MD5 | raw file
  1. // test_ump.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #ifdef DEBUG_MEMORY_LEAK
  4. #define _CRTDBG_MAP_ALLOC
  5. #include <stdlib.h>
  6. #include <crtdbg.h>
  7. #endif
  8. #include <stdio.h>
  9. #ifdef WIN32
  10. #define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
  11. #include <winsock2.h>
  12. #endif
  13. #include <glib.h>
  14. #include "test_ump.h"
  15. #include "../user_message_protocol/ump_public.h"
  16. void send_data(UMPSocket *u_sock);
  17. void receive_data(UMPSocket *u_sock);
  18. void send_file(UMPSocket *u_sock,char* filename);
  19. void receive_file(UMPSocket *u_sock,char* filename);
  20. //typedef void (*test_func1)(void);
  21. //
  22. //void print_test(void)
  23. //{
  24. // printf("aaa\n");
  25. //}
  26. //
  27. //void test_pointer_to_func()
  28. //{
  29. // gpointer p=NULL;
  30. // test_func1 fu;
  31. // p=(gpointer)print_test;
  32. // fu=(test_func1)p;
  33. // fu();
  34. //}
  35. gpointer my_malloc(gsize n_bytes)
  36. {
  37. return malloc(n_bytes);
  38. }
  39. gpointer my_realloc(gpointer mem,gsize n_bytes)
  40. {
  41. return realloc(mem,n_bytes);
  42. }
  43. void my_free(gpointer mem)
  44. {
  45. free(mem);
  46. }
  47. GMemVTable memvt={my_malloc,my_realloc,my_free,NULL,NULL,NULL};
  48. int main(int argc, char* argv[])
  49. {
  50. //guint8 x=255;
  51. //test_pointer_to_func();
  52. //ump_print(3,4);
  53. //x=x +2;
  54. //printf("%u\n",x);
  55. //printf("short %d, int %d, long %d\n",sizeof(short),sizeof(int),sizeof(long));
  56. //ump_test_packet_funcs();
  57. gboolean u_listen=FALSE;
  58. gint our_port=0,their_port=0;
  59. char* our_address=NULL,*their_address=NULL;
  60. GKeyFile *etc;
  61. UMPCore* u_core;
  62. UMPSocket* u_sock;
  63. struct sockaddr_in our,their;
  64. char* filename=NULL;
  65. //g_mem_set_vtable(&memvt);
  66. #ifdef MEM_PROFILE
  67. g_mem_set_vtable(glib_mem_profiler_table);
  68. #endif
  69. #ifdef DEBUG_MEMORY_LEAK
  70. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  71. _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
  72. _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
  73. _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
  74. _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
  75. //_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
  76. #endif
  77. etc=g_key_file_new();
  78. if(g_key_file_load_from_file(etc,"test_ump.conf",G_KEY_FILE_NONE,NULL)==FALSE){
  79. g_key_file_free(etc);
  80. g_print("error open test_ump.conf\n");
  81. getchar();
  82. return 0;
  83. }
  84. our_port=g_key_file_get_integer(etc,"general","ourport",NULL);
  85. if(our_port==0){
  86. g_key_file_free(etc);
  87. g_print("error reading ourport\n");
  88. getchar();
  89. }
  90. our_address=g_key_file_get_string(etc,"general","ouraddress",NULL);
  91. if(our_address==NULL){
  92. g_key_file_free(etc);
  93. g_print("error reading ouraddress\n");
  94. getchar();
  95. }
  96. their_port=g_key_file_get_integer(etc,"general","theirport",NULL);
  97. if(their_port==0){
  98. g_free(our_address);
  99. g_key_file_free(etc);
  100. g_print("error reading theirport\n");
  101. getchar();
  102. }
  103. their_address=g_key_file_get_string(etc,"general","theiraddress",NULL);
  104. if(their_address==NULL){
  105. g_free(our_address);
  106. g_key_file_free(etc);
  107. g_print("error reading theiraddress\n");
  108. getchar();
  109. }
  110. filename=g_key_file_get_string(etc,"general","filename",NULL);
  111. if(filename==NULL){
  112. g_free(our_address);
  113. g_free(their_address);
  114. g_key_file_free(etc);
  115. g_print("error reading filename\n");
  116. getchar();
  117. }
  118. u_listen=g_key_file_get_boolean(etc,"general","listen",NULL);
  119. g_key_file_free(etc);
  120. our.sin_family = AF_INET;
  121. our.sin_addr.s_addr=inet_addr(our_address);
  122. our.sin_port=htons(our_port);
  123. their.sin_family = AF_INET;
  124. their.sin_addr.s_addr=inet_addr(their_address);
  125. their.sin_port=htons(their_port);
  126. ump_init();
  127. ump_set_log_stream(stderr);
  128. u_core=ump_core_bind(&our,10);
  129. if(u_core==NULL){
  130. g_free(our_address);
  131. g_free(their_address);
  132. g_free(filename);
  133. g_print("bind error\n");
  134. getchar();
  135. return 0;
  136. }
  137. g_print("bind at %s:%d ok\n",our_address,our_port);
  138. if(u_listen==TRUE){
  139. g_print("start accept\n");
  140. u_sock=ump_accept(u_core);
  141. if(u_sock!=NULL){
  142. g_print("accept ok\n");
  143. //send_data(u_sock);
  144. send_file(u_sock,filename);
  145. }else{
  146. g_print("accept failed\n");
  147. }
  148. }else{
  149. g_print("start connect\n");
  150. u_sock=ump_connect(u_core,&their);
  151. if(u_sock!=NULL){
  152. g_print("connect ok\n");
  153. //receive_data(u_sock);
  154. receive_file(u_sock,filename);
  155. }else{
  156. g_print("connect failed\n");
  157. }
  158. }
  159. //getchar();
  160. //g_usleep(3000000);
  161. g_print("start close\n");
  162. if(u_sock!=NULL){
  163. ump_close(u_sock);
  164. }
  165. g_print("close ok\n");
  166. g_free(our_address);
  167. g_free(their_address);
  168. g_free(filename);
  169. #ifdef DEBUG_MEMORY_LEAK
  170. //_CrtDumpMemoryLeaks();
  171. #endif
  172. #ifdef MEM_PROFILE
  173. g_mem_profile();
  174. #endif
  175. getchar();
  176. return 0;
  177. }
  178. void send_data(UMPSocket *u_sock)
  179. {
  180. int r=0,i=0;
  181. int l=20480;
  182. char *data=NULL;
  183. data=malloc(l);
  184. if(data==NULL){
  185. printf("not enough memory\n");
  186. return;
  187. }
  188. for(i=0;i<l;i++){
  189. data[i]=i % 128;
  190. }
  191. for(i=0;i<10;i++){
  192. r=ump_send_message(u_sock,data,l);
  193. printf("%dth send result %d\n",i,r);
  194. }
  195. return;
  196. }
  197. void receive_data(UMPSocket *u_sock)
  198. {
  199. int r=0,i=0,j=0,get_ok=1;
  200. char* h=NULL;
  201. int hl=0;
  202. g_usleep(1000000);
  203. for(i=0;i<10;i++){
  204. r=ump_receive_message(u_sock,&h,&hl);
  205. printf("%dth receive result %d length %d\n",i,r,hl);
  206. for(j=0;j<hl;j++){
  207. if( (j % 128)!=h[j] ){
  208. get_ok=0;
  209. printf("bad data at %d\n",j);
  210. break;
  211. }
  212. }
  213. ump_free_message(h);
  214. h=NULL;
  215. }
  216. if(get_ok==0){
  217. printf("received bad data\n");
  218. }else{
  219. printf("all received data is good\n");
  220. }
  221. return;
  222. }
  223. void send_file(UMPSocket *u_sock,char* filename)
  224. {
  225. FILE* f=NULL;
  226. char* buffer=NULL;
  227. int l=4096;
  228. int got=0;
  229. int r=0;
  230. buffer=malloc(l);
  231. f=fopen(filename,"rb");
  232. if(f==NULL){
  233. perror("open file");
  234. free(buffer);
  235. return;
  236. }
  237. got=fread(buffer,1,l,f);
  238. while(got>0){
  239. r=ump_send_message(u_sock,buffer,got);
  240. if(r<0){
  241. printf("send error\n");
  242. break;
  243. }
  244. got=fread(buffer,1,l,f);
  245. }
  246. if(r==0 && !feof(f)){
  247. perror("read file error");
  248. }
  249. fclose(f);
  250. free(buffer);
  251. printf("send over\n");
  252. return;
  253. }
  254. void receive_file(UMPSocket *u_sock,char* filename)
  255. {
  256. FILE* f=NULL;
  257. char *buffer=NULL;
  258. int got=0;
  259. int written=0;
  260. int r=0;
  261. f=fopen(filename,"wb");
  262. if(f==NULL){
  263. perror("open file");
  264. return;
  265. }
  266. r=ump_receive_message(u_sock,&buffer,&got);
  267. while(r==0){
  268. written=fwrite(buffer,1,got,f);
  269. ump_free_message(buffer);
  270. if(written<got){
  271. perror("write file error");
  272. break;
  273. }
  274. r=ump_receive_message(u_sock,&buffer,&got);
  275. }
  276. fclose(f);
  277. printf("receive over\n");
  278. return;
  279. }