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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ожидание сообщения от клиента 
V
    Опции темы
TP@MB@Y
Дата 13.12.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Клиент посылает серверу матрицы (в виде одномерных массивов). Сервер их перемножает и отсылает клиенту результат. 
Программа написана мной, компилируется, запускается, но работает не правильно. Насколько я смог понять, затруднение состоит в том, что сервер не может принять данные от клиента. 

Вот весь код:

Код

#include "stdafx.h"
#include "iostream.h"
#include "winsock2.h"
#include "iomanip.h"

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

WSADATA WSAData;
int matr_1[9],matr_2[9],res[9];

//функция выводит матрицу
void print_m(int* m)
{
    cout<<"Matrix:"<<endl;
    for (int i=0;i<3;i++)
    {
        for (int j=0;j<3;j++)
            cout<<setprecision(3)<<setw(10)<<m[i*3+j];
        cout<<endl;
    }
}

void server_side()
{
    int i,j;

    cout<<"You are SERVER!"<<endl;

    //Создаем сокет
    SOCKET serv_socket;
    serv_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (serv_socket==INVALID_SOCKET) 
        cout<<"Invalid server socket!"<<endl;
    
    //Адрес сервера
    SOCKADDR_IN serv_addr;
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(7756);
    serv_addr.sin_addr.s_addr=0;
    if (bind(serv_socket,(sockaddr*)&serv_addr,sizeof(serv_addr))==SOCKET_ERROR) 
        cout<<"Bind error!"<<endl;
    
    //Начинаем прослушивание клиентов
    if (listen(serv_socket,1)==SOCKET_ERROR)
        cout<<"Listen error!"<<endl;
        
    //Принимаем информацию от клиента
    SOCKET cl_socket;   
    SOCKADDR_IN cl_addr; 
    int cl_addr_size=sizeof(cl_addr);
    cl_socket=accept(serv_socket,(sockaddr*)&cl_addr, &cl_addr_size);
    if (cl_socket==SOCKET_ERROR) 
        cout<<"Accept error!"<<endl;
    
    //Ждем сообщений от клиента
    recv(serv_socket,(char*)matr_1,sizeof(int)*9,0);
    print_m(matr_1);
    
    int b_recv;
    while (true)
    {
        b_recv=recv(serv_socket,(char*)matr_2,sizeof(int)*9,0);
        if ((b_recv!=SOCKET_ERROR)&&(b_recv>0)) break;
    }

    print_m(matr_2);
    
    //Обрабатываем информацию
    for (i=0;i<3;i++)
        for (j=0;j<3;j++)
        {
            res[i*3+j]=0;
            for (int k=0;k<3;k++)
                res[i*3+j]=res[i*3+j]+matr_1[i*3+k]*matr_2[k*3+j];
        }
    
    //Отсылаем результат
    send(cl_socket,(char*)res,sizeof(int)*9,0);

    //Закрываем сокет
    shutdown(serv_socket,2);
    shutdown(cl_socket,2);
    closesocket(serv_socket);
    closesocket(cl_socket);
}

void client_side()
{
    int i,j;

    cout<<"You are CLIENT!"<<endl;

    //Создаем сокет
    SOCKET cl_socket;
    cl_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (cl_socket==INVALID_SOCKET)
        cout<<"Invalid socket!"<<endl;
    
    //Адрес сервера
    SOCKADDR_IN cl_addr;
    cl_addr.sin_family=AF_INET;
    cl_addr.sin_port=htons(7756);
    cl_addr.sin_addr.s_addr=inet_addr("192.168.0.106");
    
    //Коннектимся к серверу
    if (connect(cl_socket,(sockaddr*)&cl_addr,sizeof(cl_addr))) cout<<"Connect error!"<<endl;
    
    //Клиент вводит матрицы
    cout<<"Введите первую матрицу 3*3:"<<endl;
    for (i=0;i<3;i++)
    {
        cout<<endl;
        for (j=0;j<3;j++)
        {
            cout<<"matr_1["<<i<<","<<j<<"]=";
            cin>>matr_1[i*3+j];
        }
    }
    cout<<"Введите вторую матрицу 3*3:"<<endl;
    for (i=0;i<3;i++)
    {
        cout<<endl;
        for (j=0;j<3;j++)
        {
            cout<<"matr_2["<<i<<","<<j<<"]=";
            cin>>matr_1[i*3+j];
        }
    }
    
    //Отсылаем матрицы
    send(cl_socket,(char*)matr_1,sizeof(int)*9,0);
    send(cl_socket,(char*)matr_2,sizeof(int)*9,0);
    //Ждем ответа сервера с результатом
    recv(cl_socket,(char*)res,sizeof(int)*9,0);
    //Выводим произведение матриц
    print_m(res);

    //Закрываем сокет
    shutdown(cl_socket,2);
    closesocket(cl_socket);
}

int main(int argc, char* argv[])
{
    //Запрос на сервер/клиент
    char c;
    cout<<("Are you SERVER? [y/n]")<<endl;
    do {
            cin>>c;
    }
    while ((c!='y')&&(c!='n'));
    
    //Инициализация сетевого сеанса
    WSAStartup(MAKEWORD(2,2),&WSAData);

    if (c=='y')
    { 
        server_side();
    } 
    else
    {
        client_side();
    }

    ///Закрытие сетевого сеанса
    WSACleanup();

    //Ждем ввода перед закрытием окна
    cout<<"Enter enything =)"<<endl;
    cin>>c;
    
    return 0;
}


Там я пробовал всевозможные варианты ожидания сообщения (в циклах), но всеравно не получается  smile 
Подскажите плиз в чем ошибка smile 
PM   Вверх
TP@MB@Y
Дата 14.12.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На данный момент обнаружил что функция send нифига не посылает  smile 

Код

int matr_1[9]

...

cout<<"Enter second matrix 3*3:"<<endl;
    for (i=0;i<3;i++)
    {
        cout<<endl;
        for (j=0;j<3;j++)
        {
            cout<<"matr_2["<<i<<","<<j<<"]=";
            cin>>matr_2[i*3+j];
        }
    }
    

    int bytes;
    if (bytes=send(cl_socket,(char*)&matr_2[0],sizeof(int)*9,0)==-1)
        cout<<"Send error!"<<endl;
    else 
        cout<<bytes<<"bytes send"<<endl;


т.е. выводит мне "0 bytes send"

PM   Вверх
ptr
Дата 14.12.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У сервера поменяй во всех recv() serv_socket на cl_socket. И не забывай обрабатывать ошибки.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 14.12.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ptr, огромнейшее спасибо! теперь все работает.

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


 




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


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

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