目前这部分代码会出现阻塞问题,暂时尚未解决

  1. #include "udp.h"
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <errno.h>
  8. #include <malloc.h>
  9.  
  10. #include <sys/types.h>
  11. #include <sys/socket.h>
  12. #include <netinet/in.h>
  13. #include <time.h>
  14. #include <arpa/inet.h>
  15.  
  16. int PrintDiff(diff_t *diff)
  17. {
  18. printf("\n\n-----------------------\n");
  19. printf("tow : %f\n", diff->tow);
  20. printf("numBds: %d\n", diff->numBds);
  21. printf("numGps: %d\n", diff->numGps);
  22. printf("numGln: %d\n", diff->numGln);
  23. int j;
  24. printf("system: ");
  25. for (j = ; j < MAXSAT; ++j)
  26. {
  27. printf("%d ", diff->system[j]);
  28. }
  29. printf("\n");
  30.  
  31. printf("PRN: ");
  32. for (j = ; j < MAXSAT; ++j)
  33. {
  34. printf("%d ", diff->PRN[j]);
  35. }
  36. printf("\n");
  37.  
  38. printf("dDO: ");
  39. for (j = ; j < MAXSAT; ++j)
  40. {
  41. printf("%f ", diff->dDO[j]);
  42. }
  43. printf("\n");
  44.  
  45. printf("dPR: ");
  46. for (j = ; j < MAXSAT; ++j)
  47. {
  48. printf("%f ", diff->dPR[j]);
  49. }
  50. printf("\n");
  51.  
  52. printf("------------------------------------\n");
  53. }
  54.  
  55. int server_len;
  56. int client_len;
  57.  
  58. #define RECV_LOOP_COUNT 10
  59. int recv_within_time(int fd, char *buf, size_t buf_n,struct sockaddr* addr,socklen_t *len,unsigned int sec,unsigned usec)
  60. {
  61. struct timeval tv;
  62. fd_set readfds;
  63. int i=;
  64. unsigned int n=;
  65. for(i=;i<RECV_LOOP_COUNT;i++)
  66. {
  67. FD_ZERO(&readfds);
  68. FD_SET(fd,&readfds);
  69. tv.tv_sec=sec;
  70. tv.tv_usec=usec;
  71. select(fd+,&readfds,NULL,NULL,&tv);
  72. if(FD_ISSET(fd,&readfds))
  73. {
  74. if((n=recvfrom(fd,buf,buf_n,,addr,len))>=)
  75. {
  76. return n;
  77. }
  78. }
  79. }
  80. return -;
  81. }
  82.  
  83. int rover_sock_fd;/*套接字文件描述符*/
  84. struct sockaddr_in addr_rover_server;
  85. int UdpRoverInit(char *server_ip)
  86. {
  87. char SERVER_IP_ADDRESS[]="127.0.0.1";
  88. strcpy(SERVER_IP_ADDRESS, server_ip);
  89.  
  90. rover_sock_fd = socket(AF_INET,SOCK_DGRAM,);//创建套接子
  91. //初始化服务器端地址
  92. memset(&addr_rover_server,,sizeof(addr_rover_server));
  93. addr_rover_server.sin_family = AF_INET;
  94. addr_rover_server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);
  95. addr_rover_server.sin_port = htons(SERVER_PORT);
  96.  
  97. server_len = sizeof(struct sockaddr_in);
  98. //printf("begin:\n");
  99. return rover_sock_fd;
  100. }
  101.  
  102. int UdpRoverRecieve(diff_t *diff)
  103. {
  104. int recv_num, i=;
  105. unsigned char recv_buf[MAX_LEN_ONCE];
  106. unsigned char send_buf[MAX_LEN_ONCE];
  107.  
  108. unsigned char *_dest=malloc(sizeof(diff_t)+MAX_LEN_ONCE);
  109. memset((void *)_dest,,sizeof(diff_t)+MAX_LEN_ONCE);
  110.  
  111. //发送命令
  112. memset(send_buf,,MAX_LEN_ONCE);
  113. strcpy(send_buf,"\nrover_get\n");
  114. //do
  115. sendto(rover_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_rover_server,server_len);
  116. usleep();
  117. while()
  118. {
  119. recv_num = recv_within_time(rover_sock_fd,recv_buf,MAX_LEN_ONCE,(struct sockaddr *)&addr_rover_server,&server_len,,);
  120. if (recv_num<MAX_LEN_ONCE)
  121. {
  122. continue;
  123. }
  124. if(strncmp(recv_buf,"\nserver_start\n",strlen("\nserver_start\n")))
  125. {
  126. putchar(recv_buf);
  127. printf("@@%d\n", recv_num);
  128. //return 1;
  129. }
  130. else{
  131. printf("good\n");
  132. break;}
  133. }
  134.  
  135. while() {
  136. recv_within_time(rover_sock_fd,recv_buf,MAX_LEN_ONCE,(struct sockaddr *)&addr_rover_server,&server_len,,);
  137. if (!strncmp(recv_buf,"\nserver_end\n",strlen("\nserver_end\n"))) break;
  138. if (!strncmp("\nserver |",recv_buf,strlen("\nserver |")))
  139. {
  140. memcpy(_dest+i*(MAX_LEN_ONCE/),recv_buf+(MAX_LEN_ONCE/),MAX_LEN_ONCE/);
  141. ++i;
  142. }
  143. printf(".");
  144. }
  145.  
  146. printf("-------------%d------------\n", i);
  147. if (i!=sizeof(diff_t)/(MAX_LEN_ONCE/)+)
  148. {
  149. printf("%d ,get wrong, will not update this time!\n", i);
  150. }
  151. else{
  152. memcpy((void *)diff, _dest, sizeof(diff_t)+MAX_LEN_ONCE);
  153. if ()
  154. {
  155. PrintDiff(diff);
  156. }
  157. }
  158.  
  159. free(_dest);
  160. UdpClose(rover_sock_fd);
  161. return ;
  162. }
  163.  
  164. int station_sock_fd;
  165. struct sockaddr_in addr_station_server;
  166. int UdpStationInit(char *server_ip)
  167. {
  168. char SERVER_IP_ADDRESS[]="127.0.0.1";
  169. strcpy(SERVER_IP_ADDRESS, server_ip);
  170.  
  171. station_sock_fd = socket(AF_INET,SOCK_DGRAM,);//创建套接子
  172. //初始化服务器端地址
  173. memset(&addr_station_server,,sizeof(addr_station_server));
  174. addr_station_server.sin_family = AF_INET;
  175. addr_station_server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);
  176. addr_station_server.sin_port = htons(SERVER_PORT);
  177.  
  178. server_len = sizeof(struct sockaddr_in);
  179. printf("begin send:\n");
  180.  
  181. return ;
  182. }
  183. int UdpStationSend(diff_t *diff)
  184. {
  185. int i=;
  186. int send_num;
  187.  
  188. unsigned char send_buf[MAX_LEN_ONCE];
  189. unsigned char *src = (unsigned char *)diff;
  190.  
  191. memset(send_buf,,MAX_LEN_ONCE);
  192. strcpy(send_buf,"\nstation_start\n");
  193. sendto(station_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_station_server,server_len);
  194.  
  195. int j;
  196. for (j = ; j < MAX_LEN_ONCE; ++j)
  197. {
  198. putchar(send_buf[j]);
  199. }
  200.  
  201. for(i=;i<sizeof(diff_t)/+;++i)
  202. {
  203. memset(send_buf,,MAX_LEN_ONCE);
  204. strcpy(send_buf,"\nstation|");
  205. memcpy(send_buf+,src+i*(MAX_LEN_ONCE/),MAX_LEN_ONCE/);
  206.  
  207. for (j = ; j < MAX_LEN_ONCE; ++j)
  208. {
  209. putchar(send_buf[j]);
  210. }
  211.  
  212. send_num = sendto(station_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_station_server,server_len);
  213.  
  214. usleep();
  215. }
  216. printf("---%d----%d----%d----%d----\n", i,sizeof(diff_t),MAX_LEN_ONCE/,sizeof(diff_t)/(MAX_LEN_ONCE/));
  217.  
  218. memset(send_buf,,MAX_LEN_ONCE);
  219. strcpy(send_buf,"\nstation_end\n");
  220. sendto(station_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_station_server,server_len);
  221.  
  222. for (j = ; j < MAX_LEN_ONCE; ++j)
  223. {
  224. putchar(send_buf[j]);
  225. }
  226.  
  227. return ;
  228. }
  229.  
  230. int server_sock_fd; //套接子描述符号
  231. struct sockaddr_in addr_server, addr_server_client;
  232. int UdpServerInit()
  233. {
  234. int recv_num;
  235. int send_num;
  236.  
  237. char recv_buf[MAX_LEN_ONCE];
  238.  
  239. server_sock_fd = socket(AF_INET,SOCK_DGRAM,);
  240.  
  241. if(server_sock_fd < ){
  242. perror("client socket");
  243. exit();
  244. } else{
  245. printf("client sock sucessful\n");
  246. }
  247.  
  248. memset(&addr_server,,sizeof(struct sockaddr_in));
  249. addr_server.sin_family = AF_INET;//协议族
  250. addr_server.sin_port = htons(SERVER_PORT);
  251. addr_server.sin_addr.s_addr = htonl(INADDR_ANY);//任意本地址
  252.  
  253. client_len = sizeof(struct sockaddr_in);
  254.  
  255. /*绑定套接字*/
  256. if(bind(server_sock_fd,(struct sockaddr *)&addr_server,sizeof(struct sockaddr_in))< ){
  257. perror("server bind");
  258. return -;
  259. } else{
  260. printf("server bind sucess\n");
  261. }
  262.  
  263. return ;
  264. }
  265.  
  266. int UdpServerLoop(diff_t *diff, int arg)
  267. {
  268. int recv_num,send_num, i=;
  269. unsigned char recv_buf[MAX_LEN_ONCE];
  270. unsigned char send_buf[MAX_LEN_ONCE];
  271.  
  272. unsigned char *dest=malloc(sizeof(diff_t)+MAX_LEN_ONCE);
  273. memset((void *)dest,,sizeof(diff_t)+MAX_LEN_ONCE);
  274.  
  275. unsigned char *src = (unsigned char *)diff;
  276. while()
  277. {
  278. //update diff data
  279. recv_num = recvfrom(server_sock_fd,recv_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,&client_len);
  280. int j;
  281. if(recv_num < ) {
  282. perror("recv_from");
  283. return -;
  284. }
  285.  
  286. //update diff data
  287. if (!strncmp(recv_buf,"\nstation_start\n",strlen("\nstation_start\n")))
  288. {
  289. i=;
  290. while() {
  291. recv_num = recvfrom(server_sock_fd,recv_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,&client_len);
  292. if(recv_num < ) {
  293. perror("recv_from");
  294. return -;
  295. }
  296.  
  297. if (!strncmp(recv_buf,"\nstation_end\n",strlen("\nstation_end\n"))) break;
  298. if (!strncmp("\nstation|",recv_buf,strlen("\nstation|")))
  299. {
  300. memcpy(dest+i*(MAX_LEN_ONCE/),recv_buf+(MAX_LEN_ONCE/),MAX_LEN_ONCE/);
  301. ++i;
  302. }
  303. //printf("recv sucessful\n");
  304.  
  305. }
  306.  
  307. printf("-------------%d------------\n", i);
  308. if (i!=sizeof(diff_t)/(MAX_LEN_ONCE/)+)
  309. {
  310. printf("get wrong, will not update this time!\n");
  311. }
  312. else{
  313. memcpy((void *)diff, dest, sizeof(diff_t)+MAX_LEN_ONCE);
  314. if (arg)
  315. {
  316. PrintDiff(diff);
  317. }
  318. }
  319.  
  320. }
  321.  
  322. //send diff data
  323. if(!strncmp(recv_buf,"\nrover_get\n",strlen("\nrover_get\n")))
  324. {
  325. memset(send_buf,,MAX_LEN_ONCE);
  326. strcpy(send_buf,"\nserver_start\n");
  327. sendto(server_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,client_len);
  328.  
  329. //以后要防溢出s
  330. for(i=;i<sizeof(diff_t)/(MAX_LEN_ONCE/)+;++i)
  331. {
  332. strcpy(send_buf,"\nserver |");
  333. memcpy(send_buf+(MAX_LEN_ONCE/),src+i*(MAX_LEN_ONCE/),MAX_LEN_ONCE/);
  334. send_num = sendto(server_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,client_len);
  335. if(send_num < ){
  336. perror("sendto");
  337. return -;
  338. }
  339.  
  340. }
  341. memset(send_buf,,MAX_LEN_ONCE);
  342. strcpy(send_buf,"\nserver_end\n");
  343. sendto(server_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,client_len);
  344. }
  345. }
  346. return ;
  347. }
  348.  
  349. int UdpClose(int sock_fd)
  350. {
  351. close(sock_fd);
  352. return ;
  353. }

linux网络编程笔记——UDP的更多相关文章

  1. Linux网络编程笔记(修订版)

    我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1.   基本概念 2.   基本接口 2.1.   打开一个socket 2.2.   将 ...

  2. Linux网络编程:UDP Socket编程范例

    TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...

  3. python-socket网络编程笔记(UDP+TCP)

    端口 在linux系统中,有65536(2的16次方)个端口,分为: 知名端口(Well Known Ports):0-1023,如80端口分配给HTTP服务,21端口分配给FTP服务. 动态端口(D ...

  4. linux网络编程笔记——TCP

    1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直 ...

  5. Linux网络编程:UDP实现可靠的文件传输

    我们知道,用TCP实现文件传输很简单.相对于TCP,因为UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方 ...

  6. Linux 网络编程(UDP)

    客户端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/sock ...

  7. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  8. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  9. Linux网络编程10——使用UDP实现五子棋对战

    思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...

随机推荐

  1. 248. Strobogrammatic Number III

    题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...

  2. 246. Strobogrammatic Number

    题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...

  3. C++仿函数(functor)详解

    C++仿函数(functor)详解 所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类. 因此,这里需要明确两点: 1 仿函数不是函数,它是个类: 2 仿函数重载了()运算符,使得它 ...

  4. 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍

    转自:http://blog.csdn.net/carson2005/article/details/7647500 TLD(Tracking-Learning-Detection)是英国萨里大学的一 ...

  5. ubuntu install rpm package

    Using command 'alien' instead of 'rpm'. sudo apt-get install alien alien -i tst.rpm 'man alien' for ...

  6. orzdba在5.6安装

    前言:淘宝的orzdba查看MySQL服务器当前QPS,TPS很方便,但是不少人反应,在5.6原本好用的工具不好用了,频繁出现这样警告: Warning: Using a password on th ...

  7. 加密解密(11)HMAC-在sha1,md5基础上加密

    HMAC: Hash-based Message Authentication Code http://baike.sogou.com/v10977193.htm http://www.baike.c ...

  8. BZOJ 3132 上帝造题的七分钟(二维树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3132 题意:给出一个矩阵,两种操作:(1)将某个子矩阵的数字统一加上某个值:(2)查询某 ...

  9. python 字符串换行的三种方式

    if __name__ == '__main__': #第一种: 三个单引号 print ''' aaaaaaaaaaaaaaaa         bbbbbbbbbbbbbb''' #第二种: 三个 ...

  10. zlib代码生成

    1.主页下载zlib-1.2.8的source code的压缩包:F:\Develop Tools\zlib-1.2.8 2.下载安装cmake-2.8.1-win32-x86 3.用cmake生成z ...