Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. #include <WinSock2.h>
  2. #include <WS2tcpip.h>
  3. #pragma comment(lib,"ws2_32.lib")
  4. #include <iostream>
  5.  
  6. #define HOSTIP "192.168.0.11"
  7.  
  8. enum RunType
  9. {
  10. Server,
  11. Client
  12. };
  13.  
  14. RunType runtype = RunType::Server;
  15.  
  16. void DoServer()
  17. {
  18. SOCKET serverSocketHandle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  19.  
  20. if (serverSocketHandle == NULL)
  21. {
  22. std::cerr << "Failed to create socket" << std::endl;
  23. return;
  24. }
  25.  
  26. DWORD nonBlocking = 1;
  27. if (ioctlsocket(serverSocketHandle, FIONBIO, &nonBlocking) != 0)
  28. {
  29. std::cerr << "Failed to set socket non-blocking." << std::endl;
  30. return;
  31. }
  32.  
  33. sockaddr_in listenAddress;
  34. listenAddress.sin_family = AF_INET;
  35. listenAddress.sin_addr.s_addr = INADDR_ANY;
  36. listenAddress.sin_port = htons(8000);
  37. int listenAddressSize = sizeof(listenAddress);
  38.  
  39. if (bind(serverSocketHandle,(const sockaddr*)&listenAddress,sizeof(sockaddr_in)) < 0)
  40. {
  41. std::cerr << "Failed to bind socket." << std::endl;
  42. return;
  43. }
  44.  
  45. uint32_t recvPacketCounter = 0;
  46.  
  47. while (true)
  48. {
  49. if (GetAsyncKeyState(VK_ESCAPE))
  50. return;
  51. if (recvfrom(serverSocketHandle, (char*)(&recvPacketCounter), sizeof(uint32_t), NULL, (sockaddr*)&listenAddress, &listenAddressSize) > 0) //Server is receiving messages
  52. {
  53. sendto(serverSocketHandle, (char*)&recvPacketCounter, sizeof(uint32_t), NULL, (sockaddr*)&listenAddress, sizeof(sockaddr_in)); //This send is never being picked up by the client?
  54. recvPacketCounter = ntohl(recvPacketCounter);
  55. std::cout << "Server - [Sender Port: " << ntohs(listenAddress.sin_port) << "] Echoing packet: " << recvPacketCounter << std::endl;
  56. }
  57. }
  58.  
  59. }
  60.  
  61. void DoClient()
  62. {
  63. SOCKET clientSocketHandle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  64.  
  65. if (clientSocketHandle == NULL)
  66. {
  67. std::cerr << "Failed to create socket" << std::endl;
  68. return;
  69. }
  70.  
  71. DWORD nonBlocking = 1;
  72. if (ioctlsocket(clientSocketHandle, FIONBIO, &nonBlocking) != 0)
  73. {
  74. std::cerr << "Failed to set socket non-blocking." << std::endl;
  75. return;
  76. }
  77.  
  78. uint32_t ip = INADDR_NONE;
  79. inet_pton(AF_INET, HOSTIP, &ip);
  80. if (ip == INADDR_NONE)
  81. {
  82. std::cerr << "Failed to resolve host." << std::endl;
  83. return;
  84. }
  85.  
  86. uint32_t hostip = INADDR_NONE;
  87. inet_pton(AF_INET, HOSTIP, &hostip);
  88. if (hostip == INADDR_NONE)
  89. {
  90. std::cerr << "Failed to resolve host ip." << std::endl;
  91. return;
  92. }
  93.  
  94. sockaddr_in sendtoAddress;
  95. sendtoAddress.sin_family = AF_INET;
  96. sendtoAddress.sin_addr.s_addr = hostip;
  97. sendtoAddress.sin_port = htons(8000);
  98.  
  99. sockaddr_in recvAddress;
  100. recvAddress.sin_family = AF_INET;
  101. recvAddress.sin_addr.s_addr = INADDR_ANY;
  102. recvAddress.sin_port = 0; //Not specifying a port for client so an available port will be selected when binding
  103. int recvAddressSize = sizeof(recvAddress);
  104.  
  105. if (bind(clientSocketHandle, (const sockaddr*)&recvAddress, sizeof(sockaddr_in)) < 0)
  106. {
  107. std::cerr << "Failed to bind socket." << std::endl;
  108. return;
  109. }
  110.  
  111. uint32_t packetCounter = 0;
  112. uint32_t recvPacketCounter = 0;
  113. while (true)
  114. {
  115. if (GetAsyncKeyState(VK_ESCAPE))
  116. return;
  117. uint32_t tempval = packetCounter;
  118. tempval = htonl(tempval);
  119. sendto(clientSocketHandle, (char*)(&tempval), sizeof(uint32_t), NULL, (sockaddr*)&sendtoAddress, sizeof(sockaddr_in)); //<-This works
  120. if (recvfrom(clientSocketHandle, (char*)(&recvPacketCounter), sizeof(uint32_t), NULL, (sockaddr*)&recvAddress, &recvAddressSize) > 0) //<-Never receiving a message
  121. {
  122. recvPacketCounter = ntohl(recvPacketCounter);
  123. std::cout << "Client - [Sender Port: " << ntohs(recvAddress.sin_port) << "] Received packet: " << recvPacketCounter << std::endl;
  124. }
  125. Sleep(100);
  126. packetCounter += 1;
  127. }
  128. }
  129.  
  130. int main()
  131. {
  132. char input = 0;
  133. while (input != 'c' && input != 's')
  134. {
  135. std::cout << "Enter 'c' for client or 's' for server:";
  136. std::cin >> input;
  137. }
  138.  
  139. if (input == 's')
  140. runtype = RunType::Server;
  141. else
  142. runtype = RunType::Client;
  143.  
  144. WSADATA init;
  145. if (WSAStartup(MAKEWORD(2, 2), &init) != 0)
  146. {
  147. std::cerr << "WSA Startup failed with error code: " << WSAGetLastError() << std::endl;
  148. return -1;
  149. }
  150.  
  151. if (runtype == RunType::Server)
  152. {
  153. DoServer();
  154. }
  155. if (runtype == RunType::Client)
  156. {
  157. DoClient();
  158. }
  159.  
  160. WSACleanup();
  161.  
  162. std::cout << "Program end." << std::endl;
  163. return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement