Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > передача строки клиенту


Автор: lev93 19.1.2017, 18:52
условие задания: клиент водит с клавиатуры слово серверу, а сервер получив слово обрабатывает его и передает назад клиенту строку  "Yes" если слово является палиндромом, и "No" если слово не является палиндромом.

проблема в том что сервер всегда возвращает 0, то есть "No", даже если строка является палиндромом. прошу помощи

server.cpp
Код

#include <iostream>
#include <stdio.h>
#include <winsock2.h>
using namespace std;
#define PORT 1024   // порт сервера

#pragma comment (lib, "ws2_32.lib")

int main()
{
    setlocale(LC_ALL, "rus");
    char buff[10*1014];
    char res[100], *Res;
    //  подключение библиотеки 
    if (WSAStartup(0x202, (WSADATA *) &buff[0])) { return -1;}

    //  создание сокета
    SOCKET my_sock;
    my_sock = socket(AF_INET, SOCK_DGRAM,0);
    if (my_sock == INVALID_SOCKET) { return -1; }

    //  связывание сокета с локальным адресом 
    sockaddr_in local_addr;
    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = 0;
    local_addr.sin_port = htons(PORT);
    if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr))) { return -1; }

    // обработка пакетов, присланных клиентами
    while(1)
    {
        sockaddr_in client_addr;
        int client_addr_size = sizeof(client_addr);
        int bsize = recvfrom(my_sock, &buff[0], sizeof(buff)-1, 0, (sockaddr *) &client_addr, &client_addr_size);
        if (bsize == SOCKET_ERROR)
            cout << "recvfrom() error: " << WSAGetLastError() << endl;

        // добавление завершающего нуля
        buff[bsize] = 0;
        int result;
        int left_index = 0;
        int right_index = strlen(buff) - 1;
        while( left_index < right_index ) 
        {
            if( buff[left_index++] != buff[right_index--]) 
                result = 0;
            else result = 1;
        }
        // Вывод на экран 
        cout << "Client->" << result << endl;
        _itoa_s(result, res, 10);
        Res = new char[strlen(res) + 1];
        strcpy(Res, res);
        Res[strlen(res)] = '\0';

        // посылка датаграммы клиенту
        sendto(my_sock, Res, bsize, 0, (sockaddr *)&client_addr, sizeof(client_addr));
        
    }
    return 0;
}

client.cpp
Код

#include <winsock2.h>
#include <stdlib.h>
#include <iostream> 
#include <winsock2.h>
#include <stdlib.h>
#include <iostream> 
#include <stdio.h>
#include <string.h>
#include <windows.h>
using namespace std;
#define PORT 1024
#define SERVERADDR "127.0.0.1"

#pragma comment (lib, "ws2_32.lib")

int main()
{
    setlocale(LC_ALL, "rus");
    char buff[10*1014];
    cout << "Введите '0' для выхода" << endl;

    //иницилизация библиотеки Winsocks
    if (WSAStartup(0x202,(WSADATA *)&buff[0])) { return -1; }

    //  открытие сокета
    SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
    if (my_sock==INVALID_SOCKET) { return -1; }

    //  обмен сообщений с сервером
    HOSTENT *hst;
    sockaddr_in dest_addr;

    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);

    // определение IP-адреса узла
    if (inet_addr(SERVERADDR))
        dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
    else if (hst = gethostbyname(SERVERADDR))
            dest_addr.sin_addr.s_addr = ((unsigned long **) hst->h_addr_list)[0][0];
    else {  return -1; }

    while(1)
    {
        // чтение сообщения с клавиатуры
        cout << endl << "Client-> ";
        fgets(&buff[0], sizeof(buff)-1,  stdin);
        if (!strcmp(&buff[0], "0\n")) break;

        // Передача сообщений на сервер
        sendto(my_sock, &buff[0], strlen(&buff[0]), 0, (sockaddr *) &dest_addr,sizeof(dest_addr));

        // Прием сообщения с сервера
        sockaddr_in server_addr;
        int server_addr_size = sizeof(server_addr);
        
        int n = recvfrom(my_sock, &buff[0], sizeof(buff)-1, 0, (sockaddr *) &server_addr, &server_addr_size);

        if (n == SOCKET_ERROR) { return -1; }

        buff[n] = 0;

        cout << "Server->";
        if (strcmp(buff, "1") == 0) cout << "yes" << endl; 
        if (strcmp(buff, "0") == 0) cout << "no" << endl;    

        cout << endl;
    }

    // шаг последний - выход
    closesocket(my_sock);
    WSACleanup();
    return 0;
}




Автор: feodorv 20.1.2017, 05:45
Вы передаёте серверу строчку вместе с завершающим её переводом строки '\n'. Если не хочется перелопачивать код (а это, всё же, сделать необходимо, больно он кусючий), то можно легко пофиксить:
Цитата(lev93 @  19.1.2017,  18:52 Найти цитируемый пост)
        int right_index = strlen(buff) - 2;


Автор: vol4ek 20.1.2017, 11:37
Цитата(feodorv @ 20.1.2017,  05:45)
не хочется перелопачивать код (а это, всё же, сделать необходимо, больно он кусючий)

[/QUOTE]
возьмите вот http://citforum.ru/book/cook/winsock.shtml простой эхо сервер, сделайте инверсию буфера при приеме строки и сравните с оригиналом. если совпадают, то условие выполняется. попробуйте например на слове топот.

Автор: Olej 22.1.2017, 22:26
Цитата(lev93 @ 19.1.2017,  18:52)
передает назад клиенту строку  "Yes" если слово является палиндромом, и "No" если слово не является палиндромом.

И всё ещё зависит от того, какие строки вы передаёте в качестве палиндромов - если это русскоязычная строка, то вы никогда не получите таким способом признак палиндрома, потому что такое определение строки не годится:
Код

char buff[ ]

А нужно:
Код

wchar_t buff[ ]



Автор: volatile 23.1.2017, 12:47
Цитата(Olej @ 22.1.2017,  22:26)
если это русскоязычная строка, то вы никогда не получите таким способом признак палиндрома, потому что такое определение строки не годится:
Код

char buff[ ]

А нужно:
Код

wchar_t buff[ ]



"Никогда" - зачем такие громкие слова?
Нормально сработает, при любой однобайтной русской кодировке. например cp-1251 (которая и будет по умолчанию в win*), или cp866

Автор: Olej 23.1.2017, 15:49
Цитата(volatile @ 23.1.2017,  12:47)
"Никогда" - зачем такие громкие слова?
Нормально сработает, при любой однобайтной русской кодировке. например cp-1251 (которая и будет по умолчанию в win*), или cp866

"любая однобайтная русская кодировка" - это в прошлом веке осталось ... вас обманули. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)