Advertisement
VladimirKostovsky

Osi_lab3_client

Dec 5th, 2023 (edited)
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. // server.cpp
  2. #pragma comment(lib,"Ws2_32.lib")
  3. #define _WINSOCK_DEPRECATED_NO_WARNINGS
  4. #include <iostream>
  5. #include <thread>
  6. #include <string>
  7. #include <winsock2.h>
  8.  
  9. using namespace std;
  10.  
  11. const int BUFFER_SIZE = 1024;
  12.  
  13. void receiveMessages(int clientSocket) {
  14.     char buffer[BUFFER_SIZE] = { '\0' };
  15.     int retVal;
  16.     while (true) {
  17.         retVal = recv(clientSocket, buffer, sizeof(buffer), 0);
  18.         if (retVal == SOCKET_ERROR) {
  19.             cout << "Соединение с сервером разорвано" << endl;
  20.             WSACleanup();
  21.             return;
  22.         }
  23.         cout << buffer << endl;
  24.     }
  25. }
  26.  
  27. int main() {
  28.     SetConsoleCP(1251);
  29.     SetConsoleOutputCP(1251);
  30.  
  31.     int retVal = 0;
  32.     WORD ver = MAKEWORD(2, 2);
  33.     WSADATA wsaData;
  34.     WSAStartup(ver, &wsaData);
  35.  
  36.     SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  37.     if (clientSock == SOCKET_ERROR) {
  38.         cout << "Не удается создать сокет" << endl;
  39.         WSACleanup();
  40.         return 1;
  41.     }
  42.  
  43.     string ip;
  44.     unsigned short port;
  45.  
  46.     cout << "ip: ";
  47.     cin >> ip;
  48.  
  49.     cout << "port: ";
  50.     cin >> port;
  51.  
  52.     cin.ignore(); // очистка потока ввода
  53.  
  54.     SOCKADDR_IN serverInfo;
  55.     serverInfo.sin_family = PF_INET;
  56.     serverInfo.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
  57.     serverInfo.sin_port = htons(port);
  58.  
  59.     retVal = connect(clientSock, (LPSOCKADDR)&serverInfo, sizeof(serverInfo));
  60.     if (retVal == SOCKET_ERROR) {
  61.         cout << "Не удается подключиться" << endl;
  62.         WSACleanup();
  63.         return 1;
  64.     }
  65.  
  66.     cout << "Соединение установлено успешно" << endl;
  67.  
  68.     string name;
  69.     cout << "Введите своё имя: ";
  70.     getline(cin, name);
  71.  
  72.     retVal = send(clientSock, name.c_str(), name.size(), 0);
  73.     if (retVal == SOCKET_ERROR) {
  74.         cout << "Не удается отправить" << endl;
  75.         WSACleanup();
  76.         return 1;
  77.     }
  78.  
  79.     cout << "Можете начинать общение. Для выхода из чата напишите 'stop'" << endl;
  80.  
  81.     thread(receiveMessages, clientSock).detach();
  82.    
  83.     string line;
  84.     while (true) {
  85.         getline(cin, line);
  86.         retVal = send(clientSock, line.c_str(), line.size(), 0);
  87.         if (retVal == SOCKET_ERROR) {
  88.             cout << "Не удается отправить" << endl;
  89.             WSACleanup();
  90.             return 1;
  91.         }
  92.  
  93.         if (line == "stop") {
  94.             break;
  95.         }
  96.     }
  97.  
  98.     closesocket(clientSock);
  99.     WSACleanup();
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement