JMros.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <netdb.h>
  9. #include "pxTools.h"
  10. #include "pxEpoll.h"
  11. #include "JMcan.h"
  12. #include "JMros.h"
  13. extern int epollfd;
  14. extern POSTDATABUF_S postData;
  15. static int serverfd=0;
  16. static int clientfd=0;
  17. static PXEPOLL_S *clientEpoll=NULL;
  18. static u8 allzero[8]={0};
  19. void serverReceive(PXEPOLL_S *epoll)
  20. {
  21. char buf[1024]={0};
  22. ssize_t s = read(epoll->clientfd,buf,sizeof(buf));
  23. if(s>0)
  24. {
  25. //正常接收
  26. if(s==sizeof(ROSRECVDATA_S))
  27. {
  28. // postData.wheelGet=((ROSRECVDATA_S*)buf)->whellGet;
  29. // CAN_setSendBuf(AUTOCONTROL,((ROSRECVDATA_S*)buf)->data);
  30. // CAN_setCan306(((ROSRECVDATA_S*)buf)->can306);
  31. // send(epoll->clientfd, (void*)&postData, sizeof(POSTDATABUF_S), 0);
  32. memcpy(postData.rosdata,buf+sizeof(u8),sizeof(ROSRECVDATA_S)-sizeof(u16)-sizeof(u8));
  33. }
  34. else
  35. {
  36. //数据不正常
  37. // CAN_setCan306(allzero);
  38. pxLog(ERROR,"[ROS] recv wrong pack,len:%d",s);
  39. }
  40. }
  41. else
  42. {
  43. pxLog(INFO,"[ROS] a client closed");
  44. epollDel(epoll);
  45. clientfd=0;
  46. clientEpoll=NULL;
  47. postData.status.ros=0;
  48. }
  49. }
  50. void serverReceiveFailed(PXEPOLL_S *epoll)
  51. {
  52. pxLog(INFO,"[ROS] a client closed");
  53. if(clientEpoll)
  54. {
  55. epollDel(clientEpoll);
  56. clientfd=0;
  57. clientEpoll=NULL;
  58. postData.status.ros=0;
  59. }
  60. }
  61. void server_accpet(PXEPOLL_S *epoll)
  62. {
  63. struct sockaddr_in client;
  64. socklen_t len = sizeof(client);
  65. int new_fd = accept(serverfd,(struct sockaddr*)&client,&len);
  66. if(new_fd < 0)
  67. {
  68. pxLog(INFO,"[ROS] A new client connect failed,code:%d",new_fd);
  69. return;
  70. }
  71. if(clientfd!=0)
  72. {
  73. epollDel(clientEpoll);
  74. clientEpoll=NULL;
  75. }
  76. clientEpoll=epollAdd(epollfd,new_fd,serverReceive,serverReceiveFailed,NULL);
  77. if(clientEpoll==NULL)
  78. {
  79. pxLog(ERROR,"[ROS] A new client Receive failed");
  80. }
  81. pxLog(INFO,"[ROS] A new client connect:%d",new_fd);
  82. postData.status.ros=1;
  83. clientfd=new_fd;
  84. }
  85. void ROS_listen(PXTIMER_S *p)
  86. {
  87. pxLog(INIT,"[ROS] communication Init");
  88. postData.status.ros=0;
  89. struct sockaddr_in my_addr;
  90. if ((serverfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  91. {
  92. pxLog(ERROR,"[ROS] socket error:%d,retry in 3 sec",serverfd);
  93. timerAdd(epollfd,0,3000,1,ROS_listen,NULL);
  94. return;
  95. }
  96. int mw_optval = 1;
  97. setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, (char *)&mw_optval,sizeof(mw_optval));
  98. my_addr.sin_family = AF_INET;
  99. my_addr.sin_port = htons(29812);
  100. my_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
  101. bzero(&(my_addr.sin_zero),8);
  102. if (bind(serverfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
  103. {
  104. pxLog(ERROR,"[ROS] bind error,retry in 3 sec");
  105. timerAdd(epollfd,0,3000,1,ROS_listen,NULL);
  106. return;
  107. }
  108. if (listen(serverfd, 20) == -1)
  109. {
  110. pxLog(ERROR,"[ROS] listen error,retry in 3 sec");
  111. timerAdd(epollfd,0,3000,1,ROS_listen,NULL);
  112. return;
  113. }
  114. pxLog(INIT,"[ROS] communication Init success");
  115. PXEPOLL_S *serverEpoll=epollAdd(epollfd,serverfd,server_accpet,NULL,NULL);
  116. if(serverEpoll==NULL)
  117. {
  118. pxLog(ERROR,"[ROS] server_accpet failed");
  119. return;
  120. }
  121. }