peterzig

c++ client tcp nonblocking

Apr 30th, 2020
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <WinSock2.h>
  3. #include <WS2tcpip.h>
  4. #include <fstream>
  5.  
  6. #pragma comment(lib, "ws2_32.lib")
  7.  
  8. int main() {
  9.     WSADATA wsData;
  10.     WORD ver = MAKEWORD(2, 2);
  11.  
  12.     if (WSAStartup(ver, &wsData) != 0) {
  13.         std::cerr << "Error starting winsock!" << std::endl;
  14.         return -1;
  15.     }
  16.  
  17.     SOCKET clientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  18.    
  19.  
  20.     if (clientSock == INVALID_SOCKET) {
  21.         std::cerr << "Error creating socket!, " << WSAGetLastError() << std::endl;
  22.         return -1;
  23.     }
  24.  
  25.     char serverAddress[NI_MAXHOST];
  26.     memset(serverAddress, 0, NI_MAXHOST);
  27.  
  28.     std::cout << "Enter server address: ";
  29.     std::cin.getline(serverAddress, NI_MAXHOST);
  30.  
  31.     sockaddr_in hint;
  32.     hint.sin_family = AF_INET;
  33.     hint.sin_port = htons(55000);
  34.     inet_pton(AF_INET, serverAddress, &hint.sin_addr);
  35.  
  36.     char welcomeMsg[255];
  37.     const int BUFFER_SIZE = 1024;
  38.     char bufferFile[BUFFER_SIZE];
  39.     char fileRequested[FILENAME_MAX];
  40.     std::ofstream file;
  41.  
  42.     WSAPOLLFD listeningSocketFD = {};
  43.     listeningSocketFD.events = POLLRDNORM;
  44.     listeningSocketFD.revents = 0;
  45.  
  46.     if (WSAPoll(&listeningSocketFD, 1, 1) > 0)
  47.     {
  48.         if (listeningSocketFD.revents & POLLRDNORM)
  49.         {
  50.             std::cout << "New connection accepted." << std::endl;
  51.  
  52.         }
  53.         else
  54.         {
  55.             std::cerr << "Failed to accept new connection." << std::endl;
  56.         }
  57.  
  58.     }
  59.     if (connect(clientSock, (sockaddr*)&hint, sizeof(hint)) == SOCKET_ERROR) {
  60.         std::cerr << "Error connect to server!, " << WSAGetLastError() << std::endl;
  61.         closesocket(clientSock);
  62.         WSACleanup();
  63.         return -1;
  64.     }
  65.  
  66.     int byRecv = recv(clientSock, welcomeMsg, 255, 0);
  67.     if (byRecv == 0 || byRecv == -1) {
  68.         closesocket(clientSock);
  69.         WSACleanup();
  70.         return -1;
  71.     }
  72.  
  73.     bool clientClose = false;
  74.     int codeAvailable = 404;
  75.     const int fileAvailable = 200;
  76.     const int fileNotfound = 404;
  77.     long fileRequestedsize = 0;
  78.     do {
  79.         int fileDownloaded = 0;
  80.         memset(fileRequested, 0, FILENAME_MAX);
  81.         std::cout << "Enter file name: " << std::endl;
  82.         std::cin.getline(fileRequested, FILENAME_MAX);
  83.  
  84.         byRecv = send(clientSock, fileRequested, FILENAME_MAX, 0);
  85.         if (byRecv == 0 || byRecv == -1) {
  86.             clientClose = true;
  87.             break;
  88.         }
  89.  
  90.         byRecv = recv(clientSock, (char*)&codeAvailable, sizeof(int), 0);
  91.         if (byRecv == 0 || byRecv == -1) {
  92.             clientClose = true;
  93.             break;
  94.         }
  95.         if (codeAvailable == 200) {
  96.             byRecv = recv(clientSock, (char*)&fileRequestedsize, sizeof(long), 0);
  97.             if (byRecv == 0 || byRecv == -1) {
  98.                 clientClose = true;
  99.                 break;
  100.             }
  101.  
  102.             file.open(fileRequested, std::ios::binary | std::ios::trunc);
  103.  
  104.             do {
  105.                 memset(bufferFile, 0, BUFFER_SIZE);
  106.                 byRecv = recv(clientSock, bufferFile, BUFFER_SIZE, 0);
  107.  
  108.                 if (byRecv == 0 || byRecv == -1) {
  109.                     clientClose = true;
  110.                     break;
  111.                 }
  112.  
  113.                 file.write(bufferFile, byRecv);
  114.                 fileDownloaded += byRecv;
  115.             } while (fileDownloaded < fileRequestedsize);
  116.             file.close();
  117.         }
  118.         else if (codeAvailable == 404) {
  119.             std::cout << "Can't open file or file not found!" << std::endl;
  120.         }
  121.     } while (!clientClose);
  122.     closesocket(clientSock);
  123.     WSACleanup();
  124.     return 0;
  125. }
Add Comment
Please, Sign In to add comment