Клиент посылает серверу матрицы (в виде одномерных массивов). Сервер их перемножает и отсылает клиенту результат. Программа написана мной, компилируется, запускается, но работает не правильно. Насколько я смог понять, затруднение состоит в том, что сервер не может принять данные от клиента. Вот весь код: | Код | #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; }
|
Там я пробовал всевозможные варианты ожидания сообщения (в циклах), но всеравно не получается Подскажите плиз в чем ошибка
|