Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2012, 21:21   #1
Faul969
 
Регистрация: 09.10.2010
Сообщений: 3
Лампочка Сервер и 2 клиента

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



Ошибка по-моему в этом куске кода:
Код:

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)
И сами серверы и клиенты:

Сервер: Код C++
Код:
#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;
}
Faul969 вне форума Ответить с цитированием
Старый 06.05.2012, 21:22   #2
Faul969
 
Регистрация: 09.10.2010
Сообщений: 3
По умолчанию

Клиент1:Код C++
Код:
#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:Код C++


Код:
 
#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;
 
}
Faul969 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно исправить коды клиента-сервер Watcover3396 C/C++ Сетевое программирование 1 30.10.2011 01:51
Передача файла с Клиента на Сервер Дворник Работа с сетью в Delphi 3 23.12.2010 15:44
От клиента до сервер (socket)(посылаем text) zotox Помощь студентам 4 17.10.2008 19:37
Помогите переслать файл с клиента на сервер mager Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 23.02.2007 18:58