This function creates a socket.
SOCKET socket (
int af,
int type,
int protocol );
Чат
Подскажите как лучше это сделать.
А то неделю уже парюсь и ничего толкового в голову не приходит:confused:
Заранее Спасибо!
если можешь,расскажи суть работы твоего чата.интересно,может какую идею дашь
А что тут думать. На сервере делаешь слушающий сокет и принимающий/отправляющий. И на клиенте то же самое. Когда клиент подключается получаем его IP. После этого сервер начинает посылать клиенту сервисные сообщения и если клиент откликнется, то пользователь в сети. Когда пользователь1 отправляет сообщение пользователю2 первый отправляет сообщение сначала на сервер далее можно проверить в сети ли пользователь2, после чего сервер отправляет сообщение пользователю2
Может не в тему, но совет. Вообще все действия надо валить на клиента=).
Зачем посылать какието то сервисные сообщения? Зачем проверять, что клиен постоянно доступен? Зачем изобретать велосипед? В курсе что такое TCP? Это как раз транспортный протокл, призванный держать постоянное соединение обеспечивать гарантированную доставку данных, при наличии связи. Просто делайте TCP сокет и общайтесь по вашему протоколу (ваши правила, как буду слатся сообщения в чате). Если связь с клиентом отвалится - узнаете об этом первыми )
Все присутствующие в чате должны знать,что тот или иной пользователь сейчас в сети,а может он повис или вообще вышел,а его ник будет отображен.
Поэтому сервер должен постоянно рассылать какие-нибудь пакеты клиентам,чтобы когда они возвращались обратно сигнализировали о том ,что клиент на связи.
Типа,есть же команда в ком. строке ping <IP>,обмен пакетами,ну что-то в этом роде и я хочу сделать,только прошу подскажите как:)
Повторяю исчо раз ) TCP протокол как раз и следит за тем что соединение постоянно открыто. Просто создаете TCP сокет и через него обмен данными. Если человек вышел (сокет до него закрылся) или связь оборвалась - TCP протокол тут же вернет ошибку. Все просто и не надо ничего своего выдумывать. А ping он мальенько для другого предназначен.
Хорошо,спасибо,а не подкинете тогда инфу как TCP сокет создать и как с ним работать:)
Код:
Остальное смотри в MSDN.
ЗЫ. Это что касается соккетов в Винапи. В МФЦ - есть класс CSocket...
Код:
Version: Requires Windows Sockets 1.1 or later.
Header: Declared in Winsock2.h.
Library: Use Ws2_32.lib.
Header: Declared in Winsock2.h.
Library: Use Ws2_32.lib.
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]
1 - accept
2 - открытие нового потока и передача туда сокета полученного из accept
И все.
Далее же в цикле я постоянно хочу по каждому сокету отсылать пакеты "проверки",чтобы следить за присутствием клиентов.
Т.е.,например отсылаем 1-му клиенту пакет "проверку",клиент серверу отсылает обратно,все отл.,отсылаем второму,оп,обратно не получаем,значит клиента по данному сокету больше нет,делаем соответствующие действия и так заново.
И причем эта пакетная передача должна быть сделана так ,чтобы затрачивала как можно меньше ресурсов компа и сети.
Блин еще раз, зачем что то отсылать? Для чего создан протокол TCP, который находится на более низком уровне и служет как раз для поддержания постоянного соидинения. Тоесть Если связь пропала, у тебя просто ошибка будет при обращении к сокету.
Хорошо,я понял,т.е. ты предлагаешь обращаться к каждому сокету и в случае вовращения ошибки делать соотв. действия,тогда покажи как ты хочешь обращяться к нему(код и желательно с комментариями).