Guest User

Untitled

a guest
Jan 22nd, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.40 KB | None | 0 0
  1. bool UdpClient::stopListen = false;
  2.  
  3. void UdpClient::listen(SOCKET RecvSocket, sockaddr_in addr, onReceive o, UdpClient::onError _onError)
  4. {
  5. int size = sizeof(addr);
  6. char rBuff[1024];
  7. int buffSize = sizeof(rBuff);
  8. while (!stopListen) {
  9. int err = recvfrom(RecvSocket, rBuff, sizeof(rBuff), 0, (sockaddr*)&addr, &buffSize);
  10. if (err > 0) {
  11. rBuff[err] = 0;
  12. if (o)
  13. o(rBuff);
  14. }
  15. else {
  16. if (_onError) {
  17. std::ostringstream out;
  18.  
  19. out << "recv failed: " << WSAGetLastError();
  20. _onError(out.str());
  21. }
  22. closesocket(RecvSocket);
  23. WSACleanup();
  24. return;
  25. }
  26. }
  27. }
  28.  
  29. void UdpClient::receive(onReceive r, int port, const std::string& ip)
  30. {
  31. std::ostringstream out;
  32.  
  33. WSADATA wsaData;
  34. int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  35. if (iResult != NO_ERROR) {
  36. if (_onError) {
  37. out << "WSAStartup failed with error: " << iResult;
  38. _onError(out.str());
  39. }
  40. return;
  41. }
  42.  
  43. sockaddr_in ServerAddr;
  44. ServerAddr.sin_family = AF_INET;
  45. ServerAddr.sin_port = htons(port);
  46. inet_pton(AF_INET, ip.c_str(), &ServerAddr.sin_addr);
  47.  
  48. SOCKET RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  49. if (RecvSocket == INVALID_SOCKET) {
  50. if (_onError) {
  51. out << "socket failed with error: " << WSAGetLastError();
  52. _onError(out.str());
  53. }
  54. WSACleanup();
  55. return;
  56. }
  57.  
  58. int err = bind(RecvSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
  59. if (err == SOCKET_ERROR) {
  60. if (_onError) {
  61. out << "bind failed with error: " << WSAGetLastError();
  62. _onError(out.str());
  63. }
  64. closesocket(RecvSocket);
  65. WSACleanup();
  66. return;
  67. }
  68. std::async(std::launch::async, listen, RecvSocket, ServerAddr, r, _onError);
  69. //std::thread(listen, RecvSocket, ServerAddr, r, _onError);
  70. }
  71.  
  72. std::thread(listen, RecvSocket, ServerAddr, r, _onError).detach()
  73.  
  74. #include <future>
  75.  
  76. #define WIN32_LEAN_AND_MEAN
  77. #include <WinSock2.h>
  78. #include <ws2tcpip.h>
  79.  
  80. #pragma comment (lib, "ws2_32.lib")
  81.  
  82. bool stopListen = false;
  83.  
  84. int llisten(SOCKET RecvSocket, sockaddr_in addr)
  85. {
  86. int size = sizeof(addr);
  87. char rBuff[1024];
  88. int buffSize = sizeof(rBuff);
  89.  
  90. while (stopListen == false)
  91. {
  92. int err = recvfrom(RecvSocket, rBuff, sizeof(rBuff), 0, (sockaddr*)&addr, &buffSize);
  93. if (err > 0)
  94. {
  95. std::cout << "received: " << std::string(rBuff, err) << std::endl;
  96. }
  97. else
  98. {
  99. std::cout << "recv failed: " << WSAGetLastError();
  100. closesocket(RecvSocket);
  101. WSACleanup();
  102. return 1;
  103. }
  104. }
  105.  
  106. return 0;
  107. }
  108.  
  109. int main()
  110. {
  111. std::string ip = "127.0.0.1";
  112. int port = 44444;
  113. WSADATA wsaData;
  114.  
  115. int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  116. if (iResult != NO_ERROR)
  117. {
  118. std::cout << "WSAStartup failed with error: " << iResult;
  119. return -1;
  120. }
  121.  
  122. sockaddr_in ServerAddr;
  123. ServerAddr.sin_family = AF_INET;
  124. ServerAddr.sin_port = htons(port);
  125. inet_pton(AF_INET, ip.c_str(), &ServerAddr.sin_addr);
  126.  
  127. SOCKET RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  128. if (RecvSocket == INVALID_SOCKET)
  129. {
  130. std::cout << "socket failed with error: " << WSAGetLastError();
  131. WSACleanup();
  132. return 1;
  133. }
  134.  
  135. int err = bind(RecvSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
  136. if (err == SOCKET_ERROR)
  137. {
  138. std::cout << "bind failed with error: " << WSAGetLastError();
  139. closesocket(RecvSocket);
  140. WSACleanup();
  141. return 1;
  142. }
  143.  
  144. auto result = std::async(std::launch::async, llisten, RecvSocket, ServerAddr);
  145.  
  146. std::cout << "Here we are" << std::endl;
  147. system("pause");
  148. stopListen = true;
  149. shutdown(RecvSocket, SD_BOTH); // Останавливаем сокет, прерываем блок recvfrom с ошибкой WSAEINTR
  150. closesocket(RecvSocket); // Закрываем сокет
  151. system("pause");
  152. }
  153.  
  154. Here we are
  155. Для продолжения нажмите любую клавишу . . . received: hello world
  156.  
  157. recv failed: 10004
  158. Для продолжения нажмите любую клавишу . . .
  159.  
  160. bool UdpClient::stopListen = false;
  161.  
  162. void UdpClient::listen(SOCKET RecvSocket, sockaddr_in addr, onReceive o, UdpClient::onError _onError)
  163. {
  164. int size = sizeof(addr);
  165. char rBuff[1024];
  166. int buffSize = sizeof(rBuff);
  167. while (stopListen) {
  168. int err = recvfrom(RecvSocket, rBuff, sizeof(rBuff), 0, (sockaddr*)&addr, &buffSize);
  169. if (err > 0) {
  170. rBuff[err] = 0;
  171. if (o)
  172. o(rBuff);
  173. }
  174. else {
  175. if (_onError) {
  176. std::ostringstream out;
  177.  
  178. out << "recv failed: " << WSAGetLastError();
  179. _onError(out.str());
  180. }
  181. closesocket(RecvSocket);
  182. WSACleanup();
  183. return;
  184. }
  185. }
  186. }
  187.  
  188. std::shared_future<void> UdpClient::receive(onReceive r, int port, const std::string& ip)
  189. {
  190. std::ostringstream out;
  191. std::future<void> k;
  192. std::shared_future<void> m;
  193. WSADATA wsaData;
  194. int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  195. if (iResult != NO_ERROR) {
  196. if (_onError) {
  197. out << "WSAStartup failed with error: " << iResult;
  198. _onError(out.str());
  199. }
  200. return m;
  201. }
  202.  
  203. sockaddr_in ServerAddr;
  204. ServerAddr.sin_family = AF_INET;
  205. ServerAddr.sin_port = htons(port);
  206. inet_pton(AF_INET, ip.c_str(), &ServerAddr.sin_addr);
  207.  
  208. SOCKET RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  209. if (RecvSocket == INVALID_SOCKET) {
  210. if (_onError) {
  211. out << "socket failed with error: " << WSAGetLastError();
  212. _onError(out.str());
  213. }
  214. WSACleanup();
  215. return m;
  216. }
  217.  
  218. int err = bind(RecvSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
  219. if (err == SOCKET_ERROR) {
  220. if (_onError) {
  221. out << "bind failed with error: " << WSAGetLastError();
  222. _onError(out.str());
  223. }
  224. closesocket(RecvSocket);
  225. WSACleanup();
  226. return m;
  227. }
  228.  
  229. auto n = std::async(std::launch::async, listen, RecvSocket, ServerAddr, r, _onError).share();
  230. //std::shared_future<std::future<void>> f(n);
  231. return n;
  232. }
Add Comment
Please, Sign In to add comment