Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чат

16K
23 октября 2006 года
slava-forever
21 / / 28.07.2006
Вообщем,я собираюсь написать свой чат по принципу клиент-сервер,используя Socket.Программа сервер постоянно должна проверять программу клиент на наличие соединения.Т.е. клиент работает ли или он завершил работу или завис,короче говоря нужно знать в сети ли он.
Подскажите как лучше это сделать.
А то неделю уже парюсь и ничего толкового в голову не приходит:confused:
Заранее Спасибо!
2.0K
23 октября 2006 года
Dstr
158 / / 27.04.2006
http://ishodniki.ru/list/?cat=6&show=cpp_network&pr=net_tcp ...

Сам ща пишу чат,только на Delphi...
16K
23 октября 2006 года
slava-forever
21 / / 28.07.2006
если можешь,расскажи суть работы твоего чата.интересно,может какую идею дашь
4.5K
23 октября 2006 года
e-XperT
127 / / 04.07.2006
А что тут думать. На сервере делаешь слушающий сокет и принимающий/отправляющий. И на клиенте то же самое. Когда клиент подключается получаем его IP. После этого сервер начинает посылать клиенту сервисные сообщения и если клиент откликнется, то пользователь в сети. Когда пользователь1 отправляет сообщение пользователю2 первый отправляет сообщение сначала на сервер далее можно проверить в сети ли пользователь2, после чего сервер отправляет сообщение пользователю2
17K
23 октября 2006 года
vbmikhael
27 / / 23.10.2006
Может не в тему, но совет. Вообще все действия надо валить на клиента=).
240
24 октября 2006 года
aks
2.5K / / 14.07.2006
Зачем посылать какието то сервисные сообщения? Зачем проверять, что клиен постоянно доступен? Зачем изобретать велосипед? В курсе что такое TCP? Это как раз транспортный протокл, призванный держать постоянное соединение обеспечивать гарантированную доставку данных, при наличии связи. Просто делайте TCP сокет и общайтесь по вашему протоколу (ваши правила, как буду слатся сообщения в чате). Если связь с клиентом отвалится - узнаете об этом первыми )
16K
24 октября 2006 года
slava-forever
21 / / 28.07.2006
[QUOTE=aks]Зачем посылать какието то сервисные сообщения? Зачем проверять, что клиен постоянно доступен?[/QUOTE]
Все присутствующие в чате должны знать,что тот или иной пользователь сейчас в сети,а может он повис или вообще вышел,а его ник будет отображен.
Поэтому сервер должен постоянно рассылать какие-нибудь пакеты клиентам,чтобы когда они возвращались обратно сигнализировали о том ,что клиент на связи.
Типа,есть же команда в ком. строке ping <IP>,обмен пакетами,ну что-то в этом роде и я хочу сделать,только прошу подскажите как:)
240
24 октября 2006 года
aks
2.5K / / 14.07.2006
Повторяю исчо раз ) TCP протокол как раз и следит за тем что соединение постоянно открыто. Просто создаете TCP сокет и через него обмен данными. Если человек вышел (сокет до него закрылся) или связь оборвалась - TCP протокол тут же вернет ошибку. Все просто и не надо ничего своего выдумывать. А ping он мальенько для другого предназначен.
16K
24 октября 2006 года
slava-forever
21 / / 28.07.2006
Хорошо,спасибо,а не подкинете тогда инфу как TCP сокет создать и как с ним работать:)
8.6K
24 октября 2006 года
Xavier
69 / / 23.08.2006
 
Код:
This function creates a socket.

SOCKET socket (
    int af,
    int type,
    int protocol );


Остальное смотри в MSDN.
ЗЫ. Это что касается соккетов в Винапи. В МФЦ - есть класс CSocket...
8.6K
24 октября 2006 года
Xavier
69 / / 23.08.2006
Да и ещё:
 
Код:
Version: Requires Windows Sockets 1.1 or later.
  Header: Declared in Winsock2.h.
  Library: Use Ws2_32.lib.
4.5K
24 октября 2006 года
e-XperT
127 / / 04.07.2006
br /> SOCKET soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(2000);
sin.sin_addr.s_addr = INADDR_ANY;
int err = bind(soc,(LPSOCKADDR)&sin,sizeof(sin));
err = listen(soc,SOMAXCONN) ;
SOCKADDR_IN from;
int fromlen = sizeof(from);
bool SendDataToClient = false;
while(!CloseServer)
{
//на этом месте программа останавливается и ждет подключения клиента
SOCKET socin = accept(soc,(LPSOCKADDR)&from,&fromlen);
char Buf;
CString data;
//сокет будет принимать данные до тех пор, пока клиент не отключится
while(recv(socin,&Buf,sizeof(Buf),0)>0)
{
data += Buf;
}
.....
}
[\CODE]
240
25 октября 2006 года
aks
2.5K / / 14.07.2006
Все бы хорошо, но после accept неплохо бы по человечески обрабатывать входящие подключения. Вариантов несколько. Один, довольно действенный ты сам предложил - открывать для каждого нового сокета отдельный thread. Собственно весь цикл тогда должен выглядеть как:
1 - accept
2 - открытие нового потока и передача туда сокета полученного из accept
И все.
16K
25 октября 2006 года
slava-forever
21 / / 28.07.2006
Да,именно так я и делал,все отлично до этого места.
Далее же в цикле я постоянно хочу по каждому сокету отсылать пакеты "проверки",чтобы следить за присутствием клиентов.
Т.е.,например отсылаем 1-му клиенту пакет "проверку",клиент серверу отсылает обратно,все отл.,отсылаем второму,оп,обратно не получаем,значит клиента по данному сокету больше нет,делаем соответствующие действия и так заново.
И причем эта пакетная передача должна быть сделана так ,чтобы затрачивала как можно меньше ресурсов компа и сети.
240
26 октября 2006 года
aks
2.5K / / 14.07.2006
Блин еще раз, зачем что то отсылать? Для чего создан протокол TCP, который находится на более низком уровне и служет как раз для поддержания постоянного соидинения. Тоесть Если связь пропала, у тебя просто ошибка будет при обращении к сокету.
16K
26 октября 2006 года
slava-forever
21 / / 28.07.2006
Хорошо,я понял,т.е. ты предлагаешь обращаться к каждому сокету и в случае вовращения ошибки делать соотв. действия,тогда покажи как ты хочешь обращяться к нему(код и желательно с комментариями).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог