Отправить данные сервера клиенту
У меня есть клиент и сервер. Клиент отправляет массив и номер индекса с помощью которого хочет получить число из массива. Сервер находит это число в массиве и выводит его.
Сервер:
#include <yvals.h>
#include <ymath.h>
#include <iostream>
#include <string>
#include <WinSock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#pragma comment(lib, "Ws2_32.lib")
#pragma warning(disable : 4996)
int main()
{
WSAData v_2_0;
int WSAStartup_ = WSAStartup(MAKEWORD(2, 0), &v_2_0);
if (WSAStartup_ != 0)
{
cout << "Initialization error" << endl;
}
SOCKET ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ServerSock == INVALID_SOCKET)
{
cout << "Socket not created" << endl;
}
sockaddr_in getting = {};
getting.sin_family = AF_INET;
getting.sin_port = htons(4567);
getting.sin_addr.s_addr = inet_addr("127.0.0.1");
int bind_ = bind(ServerSock, (sockaddr*)&getting, sizeof(getting));
if (bind_ == SOCKET_ERROR)
{
cout << "Error" << endl;
}
listen(ServerSock, SOMAXCONN);
if (listen(ServerSock, SOMAXCONN) == SOCKET_ERROR)
{
cout << "Network port not found" << endl;
}
sockaddr_in clientAddr = {};
int nAddrLen = sizeof(sockaddr_in);
SOCKET accept_ = accept(ServerSock, (sockaddr*)&clientAddr, &nAddrLen);
if (accept_ == INVALID_SOCKET)
{
cout << "Error" << endl;
}
char buff[255] = {};
char mess[255] = {};
string word;
int n, res;
int sum = 0;
while (true)
{
int len = recv(accept_, buff, sizeof(buff), 0);
if (len <= 0)
{
cout << "The client broke the connection" << endl;
break;
}
word = (string)buff;
n = stof(word.substr(0, word.find_first_of(' ')));
string word_ = word.substr(word.find_first_of(' '), word.find_last_of(' '));
sum = stof(word.substr(word.find_last_of(' ') + 1, word.size()));
cout << "The sum of numbers =" << sum << endl;
cout << "The arithmetic mean :" << sum/n << endl;
res=sum / n;
}
int sock2;
char buf2[255];
itoa(res, buf2, 10);
SOCKADDR_IN InetAddr;
sock2 = socket(AF_INET, SOCK_STREAM, 0);
InetAddr.sin_family = AF_INET;
InetAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
InetAddr.sin_port = htons(5151);
connect(sock2, (struct sockaddr*)&InetAddr, sizeof(InetAddr));
send(sock2, buf2, sizeof(buf2), 0);
closesocket(ServerSock);
WSACleanup();
system("pause>>void");
}
Клиент:
#include <iostream>
#include <cstdlib>
#include <WS2tcpip.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable : 4996)
using namespace std;
int main()
{
WSAData v_2_0;
WORD make = MAKEWORD(2, 2);
int WSAStartup_ = WSAStartup(make, &v_2_0);
if (WSAStartup_ != 0)
{
cout << "Error starting WinSock" << WSAStartup_ << endl;
}
SOCKET ClientSock = socket(AF_INET, SOCK_STREAM, 0);
if (ClientSock == INVALID_SOCKET)
{
cout << "Socket not created" << WSAGetLastError() << endl;
}
else
{
cout << "Connection to server successful" << endl;
}
sockaddr_in getting = {};
getting.sin_family = AF_INET;
getting.sin_port = htons(4567);
getting.sin_addr.s_addr = inet_addr("127.0.0.1");
int connResult = connect(ClientSock, (sockaddr*)&getting, sizeof(sockaddr_in));
if (connResult == SOCKET_ERROR)
{
cout << "Error! " << WSAGetLastError() << endl;
}
else cout << "Connection established" << endl;
while (true)
{
char buff[255] = {};
char mess[255] = {};
int n, num, s;
int sum = 0;
int option;
string word = "";
string fin = "";
cout << "Enter a sequence of numbers (Enter 1)" << endl;
cout << "Exit (Enter 2)" << endl;
cout << "Your number:";
cin >> option;
switch (option)
{
case 1:
{
cout << "input n: ";
cin >> n;
for (int i = 0; i < n; i++) {
cout << i + 1 << " / " << n << " : ";
cin >> num;
sum += num;
}
word = to_string(n)+' '+to_string(sum);
}
break;
case 2:
{
cout << "exit ? ";
cin >> word;
break;
}
}
for (int i = 0; i < word.size(); i++)
{
buff[i] = word[i];
}
if (strcmp(buff, "exit") == 0)
{
cout << "The connection to the server has been dropped" << endl;
break;
}
else
{
int send_ = send(ClientSock, buff, sizeof(buff), 0);
if (send_ == SOCKET_ERROR)
{
cout << "Error" << endl;
}
}
}
int listener;
int sock2;
struct sockaddr_in addr;
char buf2[255];
int bytes_read;
listener = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(5151);
addr.sin_addr.s_addr = INADDR_ANY;
bind(listener, (struct sockaddr*)&addr, sizeof(addr));
listen(listener, 2);
sock2 = accept(listener, (sockaddr*)&addr, 0);
cout <<"Result: "<< buf2 << endl;
if (closesocket(ClientSock) == SOCKET_ERROR) { cout << "Error closesocket" << endl; }
WSACleanup();
cout << "Press any key to continue" << endl;
closesocket(ClientSock);
WSACleanup();
system("pause>>void");
}
Проблема в том, что сервер не отправляет результат клиенту. Я пробовал с помощью создание новых сокетов так и с использованием предыдущих.