Необработанное исключение: выход за пределы массива. 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;
}

Ответы (0 шт):