Поток 0x1de0 завершился с кодом 0 (0x0)

686
30 декабря 2016, 11:38

Есть клиент, есть сервер. Программа-сервер инициализирует библиотеку WinSock, создаёт сокет и ожидает подключения клиента. После подключения для нового клиента создаётся новый поток, в котором осуществляется приём строки клиента, удаление всех цифр в строке если длина более 15 символов и отправка полученного результата обратно. Возникла проблема: после успешной компиляции и запуска клиента и сервера, а также их соединения, при вводе в клиент строки и нажатия на интер клиент закрывается, а не делает то, что должен.

Код сервера:

#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream> // потоки ввода-вывода
#include <winsock2.h> // работа с сокетами
#include <windows.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
DWORD WINAPI thread_func(LPVOID ps) // рабочая функция потока
{
    int i, j, l;
    char ch, b[200], r[100];
    SOCKET s = *((SOCKET *)ps); // дескриптор сокета
    while (recv(s, b, sizeof(b), 0) != 0) // пока соединение не закрыто
    {
        l = strlen(b); // длина полученной строки
        if (l > 15) // если больше 15 символов - удаляем цифры
        {
            for (i = j = 0; i < l; i++) // перебор всех символов в строке
            {
                ch = b[i]; // текущий символ
                if ((ch < '0') || (ch > '9')) b[j++] = ch; // если не цифра - оставляем в строке
            }
            sprintf(r, "\nУдалено цифр: %i", (l - j));
            b[j] = '\0'; strcat(b, r); // количество удалённых цифр
        }
        else strcpy(b, "Недостаточная длина строки");
        send(s, b, sizeof(b), 0); // отправка результата
    }
    closesocket(s); // закрытие сокета
    return 0;
}
int cl_num = 0; // количество подключённых клиентов
void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    SOCKET s1, s2;
    sockaddr_in addr1, addr2;
    int err, size;
    SetConsoleOutputCP(1251); // локализация вывода
    wVersionRequested = MAKEWORD(2, 2); //  максимальный номер версии
    err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL
    if (err != 0) return; // если ошибка - завершение работы
    addr1.sin_family = AF_INET; // тип адреса
    addr1.sin_port = htons(1280); // номер порта
    addr1.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера
    s1 = socket(AF_INET, SOCK_STREAM, 0); // создание сокета, протокол TCP
    bind(s1, (sockaddr*)&addr1, sizeof(addr1)); // связывание сокета с локальным адресом
    listen(s1, 5); // перевод сокета в состояние прослушивания
    cout << "Сервер готов к приёму клиентов." << endl;
    while (true) // вечный цикл обработки
    {
        size = sizeof(addr2);
        s2 = accept(s1, (sockaddr*)&addr2, &size); // ожидание соединения с клиентом
        cout << "Присоединился клиент #" << ++cl_num << endl;
        CreateThread(NULL, NULL, thread_func, &s2, NULL, 0); // запуск нового потока
    }
    WSACleanup(); // прекращение работы с WinSock DLL
}

Код клиента:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream> // потоки ввода-вывода
#include <winsock2.h> // работа с сокетами
#include <windows.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    SOCKET s;
    sockaddr_in addr;
    char b[200];
    int err;
    SetConsoleCP(1251); // локализаци¤ ввода
    SetConsoleOutputCP(1251); // локализаци¤ вывода
    wVersionRequested = MAKEWORD(2, 2); //  максимальный номер версии
    err = WSAStartup(wVersionRequested, &wsaData); // инициализаци¤ WinSock DLL
    if (err != 0) return; // если ошибка - завершение работы
    addr.sin_family = AF_INET; // тип адреса
    addr.sin_port = htons(1280); // номер порта
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера
    s = socket(AF_INET, SOCK_STREAM, 0); // создание сокета, протокол TCP
    connect(s, (sockaddr*)&addr, sizeof(addr)); // соединение с удалЄнным сокетом
    cout << "¬ведите строку" << endl;
    cin.getline(b, sizeof(b), '\n'); // ввод строки
    send(s, b, sizeof(b), 0); // отправка строки серверу
    if (recv(s, b, sizeof(b), 0) != 0) // получение ответа
        cout << b << endl;   // вывод результата
    closesocket(s); // закрытие сокета 
    WSACleanup(); // завершение работы с WinSock API
}
READ ALSO
vs 2015 с++ не компилирует

vs 2015 с++ не компилирует

Установил VS 2015, все хорошо, но хэлло ворлд не компилирует

511
Как запустить функцию в потоке (DLLMain)?

Как запустить функцию в потоке (DLLMain)?

ПриветствуюЕсть некая функция, которая получает хеш-сумму файла (exe) и записывает ее в файл

368