Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача строки клиенту 
:(
    Опции темы
lev93
Дата 19.1.2017, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.1.2017

Репутация: нет
Всего: нет



условие задания: клиент водит с клавиатуры слово серверу, а сервер получив слово обрабатывает его и передает назад клиенту строку  "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;
}




PM MAIL   Вверх
feodorv
Дата 20.1.2017, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



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




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
vol4ek
Дата 20.1.2017, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



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

[/QUOTE]
возьмите вот тут простой эхо сервер, сделайте инверсию буфера при приеме строки и сравните с оригиналом. если совпадают, то условие выполняется. попробуйте например на слове топот.
PM MAIL ICQ   Вверх
Olej
Дата 22.1.2017, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.11.2016

Репутация: нет
Всего: нет



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

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

char buff[ ]

А нужно:
Код

wchar_t buff[ ]



PM MAIL   Вверх
volatile
Дата 23.1.2017, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

char buff[ ]

А нужно:
Код

wchar_t buff[ ]



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

PM MAIL   Вверх
Olej
Дата 23.1.2017, 15:49 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.11.2016

Репутация: нет
Всего: нет



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

"любая однобайтная русская кодировка" - это в прошлом веке осталось ... вас обманули. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1318 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.