Lionek1437

PSI 01

Apr 15th, 2018
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 KB | None | 0 0
  1. // UDP_Communication_Framework.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #pragma comment(lib, "ws2_32.lib")
  5. #include "stdafx.h"
  6. #include <winsock2.h>
  7. #include "ws2tcpip.h"
  8.  
  9. #include<iostream>
  10. #include<fstream>
  11. #include<string>
  12. #include<stdlib.h>
  13. using namespace std;
  14.  
  15. #define TARGET_IP "127.0.0.1"
  16.  
  17. #define BUFFERS_LEN 1024
  18.  
  19. //#define SENDER
  20. #define RECEIVER
  21.  
  22. #ifdef SENDER
  23. #define TARGET_PORT 5555
  24. #define LOCAL_PORT 8888
  25. #endif // SENDER
  26.  
  27. #ifdef RECEIVER
  28. #define TARGET_PORT 8888
  29. #define LOCAL_PORT 5555
  30. #endif // RECEIVER
  31.  
  32. void InitWinsock()
  33. {
  34. WSADATA wsaData;
  35. WSAStartup(MAKEWORD(2, 2), &wsaData);
  36. }
  37.  
  38. // reads number saved as array of chars
  39. int processSize(char* buffer) {
  40. int ret = 0;
  41. ret += buffer[0] << 24;
  42. ret += buffer[1] << 16;
  43. ret += buffer[2] << 8;
  44. ret += buffer[3];
  45.  
  46. //for (int i = 0; i <= 32; i++) {
  47. // int tmp = (int)buffer[i] - 48;
  48. //printf("%d\n", tmp);
  49. // if (tmp < 10 && tmp >= 0) {
  50. // ret = ret * 10 + (int)tmp;
  51. // }
  52. // }
  53. return ret;
  54. }
  55.  
  56. //**********************************************************************
  57. int main()
  58. {
  59. SOCKET socketS;
  60.  
  61. InitWinsock();
  62.  
  63. struct sockaddr_in local;
  64. struct sockaddr_in from;
  65.  
  66. int fromlen = sizeof(from);
  67. local.sin_family = AF_INET;
  68. local.sin_port = htons(LOCAL_PORT);
  69. local.sin_addr.s_addr = INADDR_ANY;
  70.  
  71.  
  72. socketS = socket(AF_INET, SOCK_DGRAM, 0);
  73. if (bind(socketS, (sockaddr*)&local, sizeof(local)) != 0) {
  74. printf("Binding error!\n");
  75. getchar(); //wait for press Enter
  76. return 1;
  77. }
  78. //**********************************************************************
  79. char buffer_rx[BUFFERS_LEN];
  80. char buffer_tx[BUFFERS_LEN];
  81.  
  82. #ifdef SENDER
  83.  
  84. sockaddr_in addrDest;
  85. addrDest.sin_family = AF_INET;
  86. addrDest.sin_port = htons(TARGET_PORT);
  87. InetPton(AF_INET, _T(TARGET_IP), &addrDest.sin_addr.s_addr);
  88.  
  89. int size = 0;
  90. char name[] = "car.jpg";
  91.  
  92. // send file name
  93. sprintf(buffer_tx, "%s", name);
  94. printf("Sending name.\n");
  95. sendto(socketS, buffer_tx, strlen(buffer_tx), 0, (sockaddr*)&addrDest, sizeof(addrDest));
  96.  
  97. // open file
  98. FILE *p_file = fopen(name, "rb");
  99.  
  100. // get file size
  101. fseek(p_file, 0, SEEK_END);
  102. size = ftell(p_file);
  103. rewind(p_file);
  104.  
  105. // send file size
  106.  
  107.  
  108. buffer_tx[0] = (value >> 24);// &0xFF;
  109. buffer_tx[1] = (value >> 16);// &0xFF;
  110. buffer_tx[2] = (value >> 8);// &0xFF;
  111. buffer_tx[3] = value;// &0xFF;
  112.  
  113.  
  114. // sprintf(buffer_tx, "%d", size);
  115. printf("Sending size. (%d)\n", size);
  116. sendto(socketS, buffer_tx, strlen(buffer_tx), 0, (sockaddr*)&addrDest, sizeof(addrDest));
  117.  
  118. // read file into memory(buffer)
  119. char* fileBuffer = (char*)malloc(size);
  120. fread(fileBuffer, 1, size + 1, p_file);
  121.  
  122. printf("\n");
  123.  
  124. // send start indicator
  125. //strncpy(buffer_tx, "START\n", BUFFERS_LEN);
  126. //sendto(socketS, buffer_tx, strlen(buffer_tx), 0, (sockaddr*)&addrDest, sizeof(addrDest));
  127.  
  128. // send file
  129. int i;
  130. for (i = 0; i < size / BUFFERS_LEN; i++) {
  131.  
  132. memcpy(buffer_tx, fileBuffer + i * BUFFERS_LEN, BUFFERS_LEN);
  133. printf("Sending packet. (%d)\n", i);
  134. sendto(socketS, buffer_tx, BUFFERS_LEN, 0, (sockaddr*)&addrDest, sizeof(addrDest));
  135. }
  136.  
  137. // for last packet (can be shorter than BUFFERS_LEN)
  138. memcpy(buffer_tx, fileBuffer + i * BUFFERS_LEN, size % BUFFERS_LEN);
  139. printf("Sending last packet.");
  140. sendto(socketS, buffer_tx, BUFFERS_LEN, 0, (sockaddr*)&addrDest, sizeof(addrDest));
  141.  
  142. // send end indicator
  143. //strncpy(buffer_tx, "END\n", BUFFERS_LEN);
  144. //sendto(socketS, buffer_tx, strlen(buffer_tx), 0, (sockaddr*)&addrDest, sizeof(addrDest));
  145.  
  146. // close file and connection
  147. fclose(p_file);
  148. closesocket(socketS);
  149.  
  150. #endif // SENDER
  151.  
  152. #ifdef RECEIVER
  153.  
  154. int messageLength;
  155. char name[BUFFERS_LEN];
  156.  
  157. // cleans the buffer
  158. strncpy(buffer_rx, "", BUFFERS_LEN);
  159. printf("Recieving ...\n");
  160.  
  161. // get name
  162. if (recvfrom(socketS, buffer_rx, sizeof(buffer_rx), 0, (sockaddr*)&from, &fromlen) == SOCKET_ERROR) {
  163. printf("Header socket error!\n");
  164. getchar();
  165. return 1;
  166. }
  167. else {
  168. printf("Name: %s!\n", buffer_rx);
  169. }
  170. strcpy(name, buffer_rx);
  171.  
  172.  
  173. // get size
  174. if (recvfrom(socketS, buffer_rx, sizeof(buffer_rx), 0, (sockaddr*)&from, &fromlen) == SOCKET_ERROR) {
  175. printf("Header socket error!\n");
  176. getchar();
  177. return 1;
  178. }
  179. else {
  180.  
  181.  
  182.  
  183.  
  184. messageLength = processSize(buffer_rx);
  185. printf("Size: %d\n", messageLength);
  186. }
  187.  
  188. // init file
  189. FILE *p_file = fopen(name, "wb");
  190.  
  191. // read whole message
  192. int i;
  193. for (i = 0; i < messageLength / BUFFERS_LEN; i++) {
  194.  
  195. if (recvfrom(socketS, buffer_rx, BUFFERS_LEN, 0, (sockaddr*)&from, &fromlen) == SOCKET_ERROR) {
  196. printf("Socket error!\n");
  197. getchar();
  198. return 1;
  199. }
  200. else {
  201. printf("Recieving packet: %i\n", i);
  202. fwrite(buffer_rx, 1, BUFFERS_LEN, p_file);
  203. }
  204. }
  205.  
  206. // recieve last packet
  207. if (recvfrom(socketS, buffer_rx, sizeof(buffer_rx), 0, (sockaddr*)&from, &fromlen) == SOCKET_ERROR) {
  208. printf("Socket error!\n");
  209. getchar();
  210. return 1;
  211. }
  212. else {
  213. printf("Recieving last packet.");
  214. fwrite(buffer_rx, 1, messageLength % BUFFERS_LEN, p_file);
  215. }
  216.  
  217. // close file and connection
  218. fclose(p_file);
  219. closesocket(socketS);
  220.  
  221. #endif
  222. //**********************************************************************
  223.  
  224. getchar(); //wait for press Enter
  225. return 0;
  226. }
Add Comment
Please, Sign In to add comment