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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервер и 2 клиента, передача слов между сервером и клиентом 
:(
    Опции темы
faul969
  Дата 8.5.2012, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста с программами. Есть 2 клиента и 1 сервер. Клиенты отсылают по 1 слову серверу, а сервер возвращает каждому клиенту слое слово. В принципе он работает, но не правельно. Если отсылать серверу Mother и Brother, то он вернет обоим father. Если 1Mother и 1Brother то вернет sister. Если 1Mother и 2Brother. То 1-ому sister, а 2-ому father. В общем зависит от 1 цифры в слове. Не могу понять как исправить эту ошибку. Ошибка в функции сервера в первой части. Заранее спасибо за помошь.

 Сервер: 
Код


#include "stdafx.h"
#include <sys/types.h>
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"netapi32.lib")
 
DWORD WINAPI ThreadFunc(LPVOID s1)
{
   SOCKET s2 = ((SOCKET *) s1)[0];
    const int ar = 10;
    char FromClientToServer[ar];
    const int arr = 12;
    char FromServerToClient[ar]= "Sister";
    char FromServerToClient2[ar]= "Father";
//  memset(buf, 0, sizeof(buf));
    int rc;
    while(rc = recv(s2, FromClientToServer, sizeof(FromClientToServer),0))
    {   
    if(rc <= 0){perror("Ошибка приема сообщения");  return 1; } 
    else cout << "Приняли от клиента " <<  FromClientToServer << endl;
 
    if (FromClientToServer[0] == '1')
    rc = send(s2, FromServerToClient, sizeof(FromServerToClient),0);
    else rc = send(s2, FromServerToClient2, sizeof(FromServerToClient2),0);
    if(rc <= 0) {perror("Ошибка посылки сообщения");  return 1; }
    else if (FromClientToServer[0] == '1')
        cout << "Послали клиенту " << FromServerToClient << endl; 
        else cout << "Послали клиенту " << FromServerToClient2 << endl; // if (FromClientToServer[0] == 2)
        
    }
    cout << "Сокет закрыли" << endl;
    closesocket(s2); // закрыли сокет
    return 0;

 
int main(){ 
 
    setlocale (LC_ALL,"Rus");
    
        struct sockaddr_in local;
        SOCKET s, s1;
        int rc;
        //const int ar = 10;
        //  char buf[arr];
        
    WSADATA WsaData;
    int err = WSAStartup (0x0101, &WsaData);
      if (err == SOCKET_ERROR)
      {printf ("WSAStartup() failed: %ld\n", GetLastError ()); return 1;} 
 
        local.sin_family = AF_INET;
        local.sin_port = htons(7500);
        local.sin_addr.s_addr = htonl(INADDR_ANY);
       
        s = socket(AF_INET,SOCK_STREAM,0);
         if (s < 0){perror("Сокет не создан"); exit(1);}
         else cout<<"Сокет создан\n" << endl;
 
        rc = bind(s,(struct sockaddr*)&local, sizeof(local));
        if (rc < 0){perror("Соединение не проходит !"); exit(1);}
        else    cout<<"Соединение произошло\n" << endl; 
 
           rc = listen(s,5);
           if(rc){perror("Прослушка не идет");  exit(1); }
        else cout<<"Слушаем \n" << endl;
 
        int local2 = sizeof(local);
        while(s1 = accept(s,0,0))
        {
        DWORD thID; 
          CreateThread(NULL, NULL, ThreadFunc, &s1, NULL, &thID);
}
int a; cin >> a;
return 0;
}
 




Клиент1:     
 
Код



#include "stdafx.h" 
#include <sys/types.h>
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
 
# pragma comment (lib, "ws2_32.lib")
# pragma comment (lib, "netapi32.lib")
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    setlocale (LC_ALL,"Rus");
 
     struct sockaddr_in peer;
     SOCKET s;
     int rc;
     char buf [10] = "mother";
 
     WSADATA wsaData;
     int wsaret = WSAStartup (0x101, &wsaData);
     if (wsaret!=0) { return 0; }
 
     peer.sin_family = AF_INET;
     peer.sin_port = htons (7500);
     peer.sin_addr.s_addr = inet_addr ("127.0.0.1");
 
     s = socket (AF_INET, SOCK_STREAM, 0);
     if (s < 0)
     {  perror ("Сокет не создан 1");    return 1;   }
     else cout << " Сокет образован " << endl;
    
     rc = connect (s, (struct sockaddr *) &peer, sizeof (peer));
     if (rc) 
     { perror ("Ошибка подключения -  2");  return 1; }
     rc = send (s, buf, sizeof(buf), 0);
    if (rc <=0) 
     { perror ("Ошибка передачи 3");    return 1; }
    else 
cout <<"Послано серверу следующее сообщение \n " << buf << endl;
    rc = recv (s, buf, 10, 0);
     if (rc <= 0) 
        {perror ("Ошибка приема от сервара 4"); return 1;}
     else
     {  cout << "Получено от сервера сообщение \n " <<  buf << endl;}
    int a ;     cin>>a;
    return 0;
}
 





Клиент2:    
Код



// client.cpp  
 
 
#include "stdafx.h" 
#include <sys/types.h>
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include "iostream"
 
# pragma comment (lib, "ws2_32.lib")
# pragma comment (lib, "netapi32.lib")
 
using namespace std;
 
 int main(int argc, char* argv[])
{
     
     //char pota ='mama';
     struct sockaddr_in peer;
     SOCKET s, s1;
     int rc;
     char buf [10] = "Brother";
 
     WSADATA wsaData;
     int wsaret = WSAStartup (0x101, &wsaData);
     if (wsaret!=0) { return 0; }
 
     peer.sin_family = AF_INET;
     peer.sin_port = htons (7500);
     peer.sin_addr.s_addr = inet_addr ("127.0.0.1");
 
        s = socket (AF_INET, SOCK_STREAM, 0);
 
     if (s < 0)
     { 
         perror ("error socket  1");
         return 1;
     }
 
    // struct sockaddr * ss = (struct sockaddr *) &peer;
     
    rc = connect (s, (struct sockaddr *) &peer, sizeof (peer));
 
     if (rc) 
     {
         perror ("error connect  2");
         return 1;
     }
 
     rc = send (s, buf, sizeof(buf), 0);
 
 //    cout <<"from server" r<< buf << endl;
     
    if (rc <=0) 
     {
        perror ("error send 3");
            return 1;
     }
     
    else {  //printf ("From server PAPA\n", buf[0]);
        cout <<"Send to server is \n " << buf << endl;
        
     }
     
    rc = recv (s, buf, 10, 0);
     
     if (rc <= 0) 
        
        {
        perror ("error recv 4");
        return 1;
        }
     else
     {
        cout << "Receave from server \n " <<  buf << endl;
    }
    
    int a ;
    cin>>a;
    return 0;
 
}




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


Эксперт
****


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

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



Цитата(faul969 @  8.5.2012,  17:39 Найти цитируемый пост)
Не могу понять как исправить эту ошибку.

А в чём ошибка-то? Что должно быть (Вы написали, что получается)? Какое должно быть правило?


Цитата(faul969 @  8.5.2012,  17:39 Найти цитируемый пост)
    if (FromClientToServer[0] == '1')
    rc = send(s2, FromServerToClient, sizeof(FromServerToClient),0);
    else rc = send(s2, FromServerToClient2, sizeof(FromServerToClient2),0);

Вот тут-то всё и написано: критерий - первый символ присланного слова есть '1' или не '1'. А нужно как?


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


Новичок



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

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



А нужно чтобы при любом слове сначало 1-ому отправлял sister, а потом 2-ому father.
PM MAIL   Вверх
feodorv
Дата 10.5.2012, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(faul969 @  10.5.2012,  20:07 Найти цитируемый пост)
А нужно чтобы при любом слове сначало 1-ому отправлял sister, а потом 2-ому father. 

Не понял. А если клиентов трое, что третьему посылать? Или возможный максимум - 2 клиента?

Если, действительно, при посылке от клиента к северу сервер должен отвечать всем присоединившимся клиентам, то нужно серверу вести список клиентов и работать с ними одновременно. 



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


Шустрый
*


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

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



Цитата(feodorv @ 10.5.2012,  23:23)
Цитата(faul969 @  10.5.2012,  20:07 Найти цитируемый пост)
А нужно чтобы при любом слове сначало 1-ому отправлял sister, а потом 2-ому father. 

Не понял. А если клиентов трое, что третьему посылать? Или возможный максимум - 2 клиента?

Если, действительно, при посылке от клиента к северу сервер должен отвечать всем присоединившимся клиентам, то нужно серверу вести список клиентов и работать с ними одновременно.

Естественно, так и нужно делать, но мил. человек судя по-всему студент и ему сдавать лабу либо курсач, а он ничего не понимает в коде, который сам наверное не писал:)

Добавлено @ 09:08
Код

if (FromClientToServer[0] == '1') // вот здесь идет проверка на первый символ, поэтому у тебя и зависит от 1 или >1, кстати, если послать 
    rc = send(s2, FromServerToClient, sizeof(FromServerToClient),0);
    else rc = send(s2, FromServerToClient2, sizeof(FromServerToClient2),0);
    if(rc <= 0) {perror("Ошибка посылки сообщения");  return 1; }
    else if (FromClientToServer[0] == '1')
        cout << "Послали клиенту " << FromServerToClient << endl; 
        else cout << "Послали клиенту " << FromServerToClient2 << endl; // if (FromClientToServer[0] == 2)
        
    }


Поменять условие надо вместо FromClientToServer[0]=='1', на strcmp(FromClientToServer, "mother") == 0 - значит мама прислала, в противном случае - брат, но надо по-хорошему проверить на "Brother".

з.ы.: учти, что strmp - case sensitive function!

Это сообщение отредактировал(а) CuteBunny - 11.5.2012, 09:16
PM MAIL   Вверх
feodorv
Дата 11.5.2012, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(CuteBunny @  11.5.2012,  10:04 Найти цитируемый пост)
Естественно, так и нужно делать, но мил. человек судя по-всему студент и ему сдавать лабу либо курсач, а он ничего не понимает в коде, который сам наверное не писал:)

Сочувствую  smile 


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


Новичок



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

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



Всего 2 клиента. Оба отсылают слова и принимают обратно уже другие. Каждый разное. Я сам вижу, что нужно исправить 
Код


if (FromClientToServer[0] == '1') // вот здесь идет проверка на первый символ, поэтому у тебя и зависит от 1 или >1, кстати, если послать 
    rc = send(s2, FromServerToClient, sizeof(FromServerToClient),0);
    else rc = send(s2, FromServerToClient2, sizeof(FromServerToClient2),0);
    if(rc <= 0) {perror("Ошибка посылки сообщения");  return 1; }
    else if (FromClientToServer[0] == '1')
        cout << "Послали клиенту " << FromServerToClient << endl; 
        else cout << "Послали клиенту " << FromServerToClient2 << endl; // if (FromClientToServer[0] == 2)
        
    }



Код писал сам, но препод такое не принял. Сказал что слово должно быть без цифр. И как сделать подругому я не знаю, поэтому и прошу помочь
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(faul969 @  12.5.2012,  16:15 Найти цитируемый пост)
Каждый разное.

Ага, значит клиенты друг от друга не зависят?

Определить, какой именно клиент - первый или второй - присоединился к серверу можно по тому слову, которое он присылает серверу. То есть:
Код

  int rv = 0;

  while( (rc = recv(s2, FromClientToServer, sizeof(FromClientToServer),0)) > 0 )
  {   
    FromClientToServer[sizeof(FromClientToServer)-1] = '\0';
    cout << "Приняли от клиента " <<  FromClientToServer << endl;
 
    if( strcmp( FromClientToServer, "mother") == 0 )
      strcpy( FromServerToClient, "Father");
    else if( strcmp( FromClientToServer, "Brother") == 0 )
      strcpy( FromServerToClient, "Sister");
    else
      strcpy( FromServerToClient, "???");

    rc = send( s2, FromServerToClient, sizeof(FromServerToClient), 0);
    if(rc < 0) {perror("Ошибка посылки сообщения");  rv = 1; break; }
    else cout << "Послали клиенту " << FromServerToClient << endl; 
  }

  if(rc < 0){ perror("Ошибка приема сообщения");  rv = 1; } 

  cout << "Сокет закрыли" << endl;
  closesocket(s2); // закрыли сокет

  return rv;



PS mother - с маленькой буквы, как в клиенте.


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


Новичок



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

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



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


 




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


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

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