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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2007, 03:22   #1
nntpaha
Пользователь
 
Аватар для nntpaha
 
Регистрация: 22.12.2007
Сообщений: 12
По умолчанию простой сервер(клиент) TCP

Здравствуйте.
Хочу попросить помощи и совета.
Когда то давно мне на глаза попалась простая статейка "создание простого TCP сервера и клиента (Delphi & Object Pascal)". Сервер и клиент у них получался по строк 20. Компоненты использовали чтот типа TCPClient & TCPServer (как-то так).
Я особо не придал ей значения, но сейчас возникла необходимость в написании сервера и клиента, только на C++. Видел в инете много статей, с использованием сокетов, мне они если чесно показались сложноватыми
так вот к чему я:
1. не знаете где можно отрыть статейку, где описано как написать простой сервер(клиент) на с++ только чтоб было похоже как описано выше (на делфи).
2. или мне уже лезать в дебри и учить сокеты ??

Заранее благодарю)
nntpaha вне форума Ответить с цитированием
Старый 25.12.2007, 04:30   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Цитата:
Сообщение от nntpaha Посмотреть сообщение

1. не знаете где можно отрыть статейку, где описано как написать простой сервер(клиент) на с++ только чтоб было похоже как описано выше (на делфи).



В c++builder 6 для передачи какой-либо информации по сети удобнее всего использовать компоненты закладки internet: tclientsocket и tserversocket.

Для начала создадим новый проект(file->new->application), поместим на форму компоненты:

tclientsocket и tserversocket , чтобы наша программа могла быть и клиентом и сервером (не одновременно конечно ).

Далее разместим компонент tmemo (закладка standart) - в нем как вы догадались будет отображаться текст чата.

Следующим на форму нужно кинуть компонент tedit (standart) - в него мы будем писать текcт, который нужно отправить собеседнику.

Ну и конечно тяжело обойтись без кнопки отправить - кидаем на форму tbutton . Кроме того что уже есть на форме, нам еще понадобится три кнопки и два эдита (tedit) (их назначение описывается по ходу обращения к ним) .

Итак, на форме :

clientsocket1 и serversocket1
memo1
edit1,edit2,edit3
button1,button2,button3,button4
Теперь изменяем свойства:

button1->caption на "Отправить"
button2->caption на "Создать"
button3->caption на "Соединиться" и
button4->caption на "Отключить" .
Убираем текст во всех Эдитах . Свойство memo1->readonly = true ,

clientsocket1->host - нужно написать ip-адрес сервера к которому вы будете присоеденяться

(ip-адресс устанавливается в настройках соединения windows), если прописать 127.0.0.1 , то вы будете конектиться к себе на компьютер (так удобно делать, когда проверяешь на работоспособность свою программу. Запустив ее дважды, одна клиент с 127.0.0.1 , а другая сервер !) если же вы коннектитесь к другу, то заранее договоритесь какой будет Ай-Пи-адрес (143.0.0.5 - например). Но для того чтобы Ай-Пи -адресс можно было легко сменить, мы и положили на форму один из Эдитов, его текст при коннекте и будет отвечать свойству clientsocket1->host и clientsocket1->address .

В свойстве clientsocket1->port и servertsocket1->port - должны стоять одинаковые значения, чтобы Сервер и Клиент прослушивали и работали на один порт . Число можно выбрать любое (1024 например).

Кнопка "Создать" - активизирует сервер. Он начинает прослушивать порт на коннект со стороны клиента .

Код:
void __fastcall tform1::button2click(tobject *sender)
{
serversocket1->active = true ;
// Делаем недоступную "Соединиться" (так как мы уже сервер)
button3->enabled = false
// Делаем доступную "Отключиться" (понятно зачем)
button4->enabled = true
memo1->lines->add("Сервер создан") ;
}
Так наша программа стала сервером !

Давайте опишем клиента!(Кнопка "Соединиться")

В edit3->text впишите 127.0.0.1 - предполагается что тестироваться будет на одном компьютере (что б других не заморачивать

Код:
void __fastcall tform1::button3click(tobject *sender)
{
edit3->text = clientsocket1->host // Присваиваем Клиенту Ай-Пи из Эдита
edit3->text = clientsocket1->address
serversocket1->active = true ;
// Делаем недоступную "Создать" (так как мы коннектимся)
button2->enabled = false
// Делаем доступную "Отключиться" (понятно зачем)
button4->enabled = true
}
Дальше будем описывать свойства компонентов Клиента и Сервера onconnect (когда присоединился) .

Код:
void __fastcall tform1::serversocket1clientconnect(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add("Клиент присоединился");
}
Это когда вы сервер и к Вам присоединились, на Мемо появится надпись !

Для клиента почти так само :

Код:
void __fastcall tform1::clientsocket1connect(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add("Вы присоединены");
}
Теперь самое главное - описание кнопки "Отправить :

Код:
if(edit2->text == "")
showmessage("Введите Ваш ник !");
return ;
}
if(edit1->text == "")
{
showmessage("Введите текст который надо отправить");
return ;
}
//Это была обработка исключительных ситуаций , типа пустых строк ввода ;

Код:
memo1->lines->add(edit2->text+":: "+ edit1->text) ;
if (serversocket1->active == true) {
serversocket1->socket->connections[0]->
sendtext(edit2->text+"::"+edit1->text); }
else
{ clientsocket1->socket->sendtext(edit2->text+"::"+edit1->text);}
edit1->text = "" ;
}

Последний раз редактировалось merax; 25.12.2007 в 04:32.
merax вне форума Ответить с цитированием
Старый 25.12.2007, 04:30   #3
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Теперь разберемся с этой кучей кода :

Код:
//добавляем свое сообщение себе в Мемо
memo1->lines->add(edit2->text+":: "+ edit1->text) ;
if (serversocket1->active == true){serversocket1->socket->
connections[0]->sendtext(edit2->text+"::"+edit1->text)};
Если мы сервер, то посылаем нашу строку первому в списке клиенту ( чат розщитан на двоих ) , иначе : 

else {
clientsocket1->socket->sendtext(edit2->text+"::"+edit1->text);
}
Посылаем строку серверу !

Независимо от того кто мы (клиент-сервер)

Очищаем Эдит1 :

edit1->text = "" ;
Также надо описать прием информации и занесение ее в Мемо1. Делается это обработчиком события onread у tclientsocket и tserversocket :

Код:
void __fastcall tform1::clientsocket1read(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add(socket->receivetext()) ;
}
void __fastcall tform1::serversocket1clientread(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add(socket->receivetext()) ;
}

Цитата:
Сообщение от nntpaha Посмотреть сообщение
2. или мне уже лезать в дебри и учить сокеты ??

А почему бы и нет?
merax вне форума Ответить с цитированием
Старый 25.12.2007, 16:21   #4
nntpaha
Пользователь
 
Аватар для nntpaha
 
Регистрация: 22.12.2007
Сообщений: 12
По умолчанию

приятно удивлен))
огромное спасибо )
nntpaha вне форума Ответить с цитированием
Старый 25.12.2007, 19:02   #5
nntpaha
Пользователь
 
Аватар для nntpaha
 
Регистрация: 22.12.2007
Сообщений: 12
По умолчанию

а можно мне еще вопрос, вернее совет:какую вы мне можете посоветовать книгу для изучения программирования серверов(клиентов) на С++ ??
nntpaha вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простой SMTP-сервер SlIgor Помощь студентам 3 09.06.2008 20:47
Простой клиент обмена сообщениями eks-s Работа с сетью в Delphi 1 04.03.2008 01:03
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57
Клиент-сервер Scorpio Работа с сетью в Delphi 6 13.02.2007 22:57