@Sawayadi

Как правильно запустить клиент-серверную программу?

Я попытался сделать по примерам примерную программу клиент-сервер:
#include <iostream> 
#include <sstream> 
#include <string.h> 
#include <winsock2.h> 
#include <windows.h> 
#include <string> 
#include <fstream> 
#include <vector> 

#pragma warning(disable:4996) 
#pragma comment(lib, "ws2_32.lib") 

#define DEFAULT_BUFLEN 1024 

using namespace std;

void split(vector<string>& dest, const string& str, const char* delim) {
    char* pTempStr = strdup(str.c_str());
    char* pWord = strtok(pTempStr, delim);
    while (pWord != NULL)
    {
        dest.push_back(pWord);
        pWord = strtok(NULL, delim);
    }

    free(pTempStr);
}

string calculate(float k, string op, float n) {
    ostringstream oss;

    if (op == "+") oss << k + n;
    else if (op == "-") oss << k - n;
    else if (op == "*") oss << k * n;
    else if (op == "/") oss << k / n;
    else return "Error";

    string str_result(oss.str());
    return str_result;
}

int main(int argc, char* argv[]) {
    string sock_type = "";
    string listen_ip = "";
    string listen_port = "";
    if (argc == 4) {
        sock_type = string(argv[1]).substr(1);
        listen_ip = string(argv[2]).substr(3);
        listen_port = string(argv[3]).substr(3);
    }
    else return -1;

    WSAData wData;
    if (WSAStartup(MAKEWORD(2, 2), &wData) == 0)
        printf("WSA startup success\n");
    else
        return -1;
    SOCKADDR_IN workon_addr;
    workon_addr.sin_addr.S_un.S_addr = inet_addr(listen_ip.c_str());
    workon_addr.sin_port = htons(atoi(listen_port.c_str()));
    workon_addr.sin_family = AF_INET;

    SOCKET workon_sock = socket(AF_INET, SOCK_STREAM, NULL);
    if (workon_sock == SOCKET_ERROR) {
        printf("Socket creation error\n"); return -1;
    }
    if (sock_type == "S") {
        if (bind(workon_sock, (struct sockaddr*)&workon_addr, sizeof(workon_addr)) != SOCKET_ERROR)
            printf("Socket binding successful\n");
        else {
            printf("Cannot bind socket to this address\n"); return -1;
        }
        if (listen(workon_sock, SOMAXCONN) != SOCKET_ERROR)
            printf("Listening on port %u\n", ntohs(workon_addr.sin_port));
        else {
            printf("Cannot listen on this address"); return -1;
        }
        while (true) {
            SOCKET client_sock;
            SOCKADDR_IN client_addr; 
            int addr_len = sizeof(client_addr); 
            if ((client_sock = accept(workon_sock, (struct sockaddr*)&client_addr, &addr_len)) != 0) {

                printf("Client connected from %s:%u\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

                int recv_size;
                char recv_buffer[DEFAULT_BUFLEN]; 

                string recv_string = ""; 
                while ((recv_size = recv(client_sock, recv_buffer, sizeof(recv_buffer), 0)) > 0) {
                    recv_string.append(recv_buffer, recv_buffer + recv_size);
                }
                vector<string> values; 
                split(values, recv_string, " "); 

                string result = calculate(stof(values[0]), values[1], stof(values[2])); 

                send(client_sock, result.data(), result.size(), NULL); 
                closesocket(client_sock);
            }
        }
    }
    else if (sock_type == "C") {
        string send_buffer;

        int recv_size;
        char recv_buffer[DEFAULT_BUFLEN];
        string recv_string;
        connect(workon_sock, (struct sockaddr*)&workon_addr, sizeof(workon_addr));
        printf("Your string: "); 
        getline(cin, send_buffer);
        if (send_buffer == "exit") { 
            closesocket(workon_sock);
            WSACleanup();
            exit(0);
        };
        send(workon_sock, send_buffer.data(), send_buffer.size(), NULL);
        shutdown(workon_sock, SD_SEND);

        while ((recv_size = recv(workon_sock, recv_buffer, sizeof(recv_buffer), 0)) > 0) {
            recv_string.append(recv_buffer, recv_buffer + recv_size);
        }
        cout << "Result: " << recv_string << endl; 
        closesocket(workon_sock);
        WSACleanup();
        exit(0);
    }
    return 0;
}

Я записал весь этот код в cpp файл и когда запустил его без откладки вывелось вот это:
D:\ServerTest\test1\x64\Debug\test1.exe (процесс 10128) завершил работу с кодом -1.
Нажмите любую клавишу, чтобы закрыть это окно...
К сожалению только это выводит. Буду рад за помощь в решении данной проблемы
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
Ну так произошла одна из ошибок, но в коде нет ничего чтобы сообщить тебе какая именно.
Например поменяй коды возврата функции main на разные (сейчас там везде стоят -1), так сможешь понять по коду который тебе вернет программа при завершении, в каком месте это произошло.

И еще, лучше в момент ошибки перед завершением работы программы вывести текстом, что именно произошло.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы