Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. int rcsRecv (int sockfd, void * buf, int len) {
  2. cout << "*****receiving on " << sockets[sockfd].sockfd << endl;
  3. sendbase = recvbase = 0;
  4. vector<RCSPacket> packets;
  5. unsigned short numpackets = 1;
  6. int result = 0;
  7. ucpSetSockRecvTimeout(sockets[sockfd].sockfd, NULL);
  8. RCSPacket rcvpacket, sendpacket;
  9. for (int i = 0; i < numpackets; ++i) {
  10. while(true){
  11. memset(&rcvpacket, 0, sizeof(rcvpacket));
  12. result = ucpRecvFrom(sockets[sockfd].sockfd, &rcvpacket, sizeof(rcvpacket), sockets[sockfd].addr);
  13. cout << "rcvd [" << rcvpacket.seq << "]: " << rcvpacket.data << " - corrupt: " << isCorrupt(rcvpacket) << endl;
  14.  
  15. memset(&sendpacket, 0, sizeof(rcvpacket));
  16. sendpacket.ack = true;
  17. if (isCorrupt(rcvpacket) || rcvpacket.seq != i) {
  18. sendpacket.seq = i-1;
  19. sendpacket.checksum = computeChecksum((unsigned char*)&sendpacket, sizeof(sendpacket));
  20. result = ucpSendTo(sockets.at(sockfd).sockfd, &sendpacket, sizeof(sendpacket), sockets.at(sockfd).addr);
  21. } else {
  22. sendpacket.seq = i;
  23. sendpacket.checksum = computeChecksum((unsigned char*)&sendpacket, sizeof(sendpacket));
  24. result = ucpSendTo(sockets.at(sockfd).sockfd, &sendpacket, sizeof(sendpacket), sockets.at(sockfd).addr);
  25. break;
  26. }
  27. }
  28.  
  29. numpackets = rcvpacket.numpackets;
  30. packets.push_back(rcvpacket);
  31. //insertPacket(&packets, &packet);
  32. }
  33.  
  34. int length = len;
  35. int ret = 0;
  36. for (int i=0; i < (int)packets.size(); i++) {
  37. ret += sizeof(packets.at(i));
  38. memcpy((char*)buf + (len - length), packets.at(i).data, min(PACKET_SIZE, length));
  39. length -= PACKET_SIZE;
  40. }
  41. cout << "*****RECEIVED " << ret << " bytes: " << (char*)buf << endl;
  42. return ret;
  43. }
  44.  
  45. int rcsSend (int sockfd, const void * buf, int len) {
  46.  
  47. cout << "*****sending " << (char*) buf << " to " << sockets[sockfd].sockfd << endl;
  48.  
  49. char * buffer = (char *) buf;
  50. vector<RCSPacket> packets;
  51. int length = len;
  52. int ret = 0;
  53.  
  54. //cout<<"Buffer size is "<<len
  55. int numpackets = ceil(((double)len) / (double)PACKET_SIZE);
  56. for (int i = 0; i < numpackets; ++i) {
  57. // Take care of case when last packet isn't PACKET_SIZE
  58. int size = min(PACKET_SIZE, length);
  59. length -= size;
  60.  
  61. // Create the packet
  62. RCSPacket p;
  63. memset(&p, 0, sizeof(p));
  64. p.sockfd = sockfd;
  65. p.seq = i;
  66. p.numpackets = numpackets;
  67. memcpy(p.data, &buffer[i*PACKET_SIZE], size);
  68. //cout << p.data << " : " << size << endl;
  69. ret += sizeof(p);
  70. packets.push_back(p);
  71. }
  72.  
  73. ucpSetSockRecvTimeout(sockets[sockfd].sockfd, 100);
  74.  
  75. cout << "packet size: " << packets.size() << endl;
  76. int result = 0;
  77. for (int i = 0; i < (int)packets.size(); ++i) {
  78.  
  79. RCSPacket sendpacket, rcvpacket;
  80. sendpacket = packets.at(i);
  81.  
  82. sendpacket.checksum = computeChecksum((unsigned char *)&sendpacket, sizeof(sendpacket));
  83. cout << "fork sending [" << sendpacket.seq << "]: " << sendpacket.data << endl;
  84.  
  85. do {
  86. // Send the message
  87. result = ucpSendTo(sockets[sockfd].sockfd, &sendpacket, sizeof(sendpacket), sockets.at(sockfd).addr);
  88. // rcsRecv needs timeout then....
  89. result = ucpRecvFrom(sockets.at(sockfd).sockfd, &rcvpacket, sizeof(rcvpacket), NULL);
  90. } while (result == -1 || isCorrupt(rcvpacket) || !rcvpacket.ack || rcvpacket.seq != sendpacket.seq);
  91. }
  92. cout << "*****SENT " << ret << " bytes: " << (char*)buf << endl;
  93. return ret;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement