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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие клиентов 
:(
    Опции темы
kleks
Дата 2.5.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть сервер, к которому подсоединяются два клиента...как мне в данном случае, организовать обмен информацией между этими клиентами??? заранее благодарен...
Исходник сервера:
Код

// SocketServer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <winsock2.h>
#include <iostream>

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

DWORD WINAPI ConnThread(void* pParam)
{
SOCKET sockClient=(SOCKET)pParam;
SOCKADDR_IN addr;
int length=sizeof(addr);
getpeername(sockClient,(SOCKADDR*)&addr,&length);
printf("Client %s connected\n",inet_ntoa(addr.sin_addr));
char buf[256];
int result=1;
while((result=recv(sockClient,buf,sizeof(buf)-1,0))!=SOCKET_ERROR && result>0)
    {
    buf[result]=0;
    printf(buf);
    printf("\n");
    }
closesocket(sockClient);
printf("Client %s disconnected\n",inet_ntoa(addr.sin_addr));
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////

int main()
{
WORD wVersion;
WSADATA wsaData;
int result;
wVersion=MAKEWORD(1,1);
result=WSAStartup(wVersion,&wsaData);
if (result!=0)
    {
    printf("ERROR: Initialization failed.\n");
    return -1;
    }
SOCKET sockServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sockServer==INVALID_SOCKET)
    {
    printf("ERROR: Cannot create a socket.\n");
    return -1;
    }
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addr.sin_port=htons(1500);
result=bind(sockServer,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
if (result!=0)
    {
    printf("ERROR: Cannot bind socket.\n");
    return -1;
    }
result=listen(sockServer,SOMAXCONN);
if (result!=0)
    {
    printf("ERROR: Cannot connect.\n");
    return -1;
    }
while(1)
    {
    SOCKET sockClient=accept(sockServer,NULL,NULL);
    if (sockClient!=INVALID_SOCKET)
        {
        DWORD dwID;
        HANDLE hThread=CreateThread(NULL,0,ConnThread,(void*)sockClient,0,&dwID);
        CloseHandle(hThread);
        }
    }
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////

PM MAIL   Вверх
GremlinProg
Дата 2.5.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если подразумеваются только 2 клиента, то нет смысла в сервере, если это чат, то нужно продумать список команд, на которые сервер будет отвечать, например:

 1. Зарегистировать пользователя(собрать минимум информации: ip, имя и т.п.)
 2. Войти в чат(уже зарегаленный пользователь)
 3. Получить список активных пользователей
 4. Отправить сообщение пользователю № x, из этого списка
 5. Получить список сообщений текущего пользователя (простой вариант, но не выгодный для сервера)
 6. "Я живой" (посылает клиент по истечению, например 10-20 сек)

Я предлагаю вариант, при котором не нужно постоянно слушать клиента, сервер и клиент обмениваются короткими пакетиками, чтобы не сильно нагружать/усложнять сервер. (для небольшого числа клиентов, даже потоки не понадобятся)

1 и 2 можно объединить, но тогда клиенту придется каждый раз заполнять лишние поля, а так, сервер просто запоминает у себя в списке очередного клиента и маркирует его флагом "активен", а при входе пробегает по этому списку, сверяя поле IP с клиентом, если есть совпадение, то включаем активность.
3 - клиент сам посылает серверу этот запрос, сервер просто пробегает по списку пользователей, проверяя флаг "активен" и посылает минимум этой инфы клиенту.
4 - клиент говорит серверу, мол передай вот тому юзверю то-то... и то-то... Сервер пробегает по тому же списку и ищет этого пользователя, если он активен, то добавляет в список сообщений новое.
5 - Если использовать простой подход, где сервер хранит все сообщения у себя, то клиент, например каждые 30-60 сек, или чаще, посылает этот запрос серверу, сервер отвечает списком сообщений, которые ищет опять же по своей мини-базе клиентов.(запросы 4 и 5 работают с одним и тем же списком сообщений)
6 - Реализовывать не обязательно, но можно, чтобы знать, какие пользователи активны, а какие - нет, если сервер не получил пакет в заданное время, то он устанавливает клиента в состояние неактивен, при последующих запросах списка пользователей от остальных клиентов так можно будет довольно просто вести список именно активных.

Тут можно еще организовать нечто, наподобие кукес, т.е. вместо IP (его лучше вообще не использовать при идентификации) генерировать случайную последовательность, "ключ", который впоследствии сохраняется на обеих сторонах и предоствавляется каждый раз при входе или запросе. 

ну как, идея понятна?


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


 




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


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

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