Необработанное исключение: выход за пределы массива. TCP/IP. C++.Сокеты
Задание: Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает слово серверу, сервер возвращает назад в обратном порядке следования букв это слово клиенту.
Проблема: вызывает исключение в серверной части, по отладчику в строке cout << b << endl << endl; выход за пределы массива.
Впервые столкнулась с обработкой исключений, не знаю как правильно сделать или просо можно что-то исправить без обработки?
Серверная часть:
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <iostream>
#include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData);
struct sockaddr_in peer;
peer.sin_family = AF_INET;
peer.sin_port = htons(1280);
peer.sin_addr.s_addr = inet_addr("127.0.0.1");// т.к. клиент и сервер на одном компьютере,
//пишем адрес 127.0.0.1
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
connect(s, (struct sockaddr*)&peer, sizeof(peer));//приложение-клиент посылает запрос
//на открытие соединения
char buf[255], b[255];
cout << "Enter one word, please" << endl << endl;
cin.getline(buf, 100, '\n');
send(s, buf, sizeof(buf), 0);
if (recv(s, b, sizeof(b), 0) != 0)
{
b[strlen(b)] = '\0'; //Удаление ненужных символов в конце строки
cout << b << endl << endl;
}
closesocket(s);
WSACleanup();
return 0;
}
Клиентская часть:
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h> //библиотека, позволяющая реализовать программный интерфейс WinSock
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main()
{
WORD wVersionRequested; //определяет макс. номер версии WinSock, доступный приложению
WSADATA wsaData; //структура wsaData, содержит номер версии (поле wVersion),
//максимальный номер версии (поле wHighVersion),
//текстовые строки с описанием реализации WinSock, максимальное число сокетов,
//доступных процессу и максимально допустимый размер дейтаграмм
wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData); //инициализация WinSock API
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //дескриптор сокета, функция для
// создания сокета, принимает три параметра: домен, тип сокета и протокол
struct sockaddr_in local; //структура адреса
local.sin_family = AF_INET; //всегда имеет значение AF_INET
local.sin_port = htons(1280); //определяет порт, который будет ассоциирован с сокетом
local.sin_addr.s_addr = htonl(INADDR_ANY); //физический IP-адрес компьютера
int c = bind(s, (struct sockaddr*)&local, sizeof(local)); //для связывания конкретного адреса с сокетом
int r = listen(s, 5); //помещает сокет в состояние прослушивания
while (true)
{
char b[255];
sockaddr_in remote_addr;
int size = sizeof(remote_addr);
SOCKET s2 = accept(s, (struct sockaddr*)&remote_addr, &size);//При получении запроса клиента
//выполняется открытие соединения
while (recv(s2, b, sizeof(b), 0) != 0) //прием данных через сокет потока
{
_strrev(b); //инвертировать строку
send(s2, b, sizeof(b), 0);// посылает данные на соединенный сокет
}
closesocket(s2); //завершение работы сокета
}
WSACleanup(); //завершая программу, прекращаем работу с WinSock
return 0;
}