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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2011, 18:59   #1
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию Элементарное клиент-серверное приложение (Winsock)(Delphi)

Всем доброго времени суток.
Задача состоит в том, чтобы написать очень элементарное приложение на сокетах (Winsock) для понимания их работы.
Есть две программы: клиент и сервер.
Суть клиента: установить соединение с сервером и отослать сообщение "привет".
Суть сервера: установить соединение с клиентом и принять от него сообщение и отобразить его в поле Memo.

Сервер:
Код:
begin
WSAStartup($0101, Data);
S:=Socket(AF_Inet, Sock_Stream, 0);
Addr.sin_family:=AF_Inet;
Addr.sin_port:=HToNs(3310);
Addr.sin_addr.S_addr:=htonl(InAddr_Any);
FillChar(Addr.sin_zero, sizeOf(Addr.sin_zero),0);
Bind(S, addr, sizeof(TSockaddr));
Listen(S, SoMaxConn);
i:=sizeof(TSockaddr);
New_S:=accept(S,@Addr,@i);
  begin
   z:=recv(New_S,buff,Length(buff),0);
   if z<>-1 then Memo1.Lines.Add('> '+buff);
  end;
end;
Клиент:
Код:
buff:='Привет';
WSAStartup($0101, Data);
S:=Socket(AF_Inet, Sock_Stream, 0);
Addr.sin_family:=AF_Inet;
Addr.sin_port:=HToNs(3050);
Addr.sin_addr.S_addr:=Inet_Addr('127.0.0.1');
FillChar(Addr.sin_zero, SizeOf(Addr.sin_zero),0);
Connect(S,addr,sizeof(TSockAddr));
begin
send(S,buff,length(buff),0);
end;
П.С.: инициализация сокета производится путём нажатия на кнопку в приложениях.

Проблема: запускаются оба приложения. В них нажимаются по очереди кнопки инициализации сокета. После этого сервер просто зависает. Клиент вроде живой.

Понятия не имею в чём дело. Если кто-нибудь сможет подсказать, как быть в такой ситуации, то буду благодарен.
Recart вне форума Ответить с цитированием
Старый 28.11.2011, 19:14   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Понятия не имею в чём дело

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Цитата:
The accept function can block the caller until a connection is present if no pending connections are present on the queue, and the socket is marked as blocking.
> как быть в такой ситуации

1) юзать неблокорующие сокеты
2) слушать в отдельном потоке
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 28.11.2011, 19:41   #3
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

> юзать неблокорующие сокеты

Их? Ну допустим...
У меня есть два примера с ними, но в одном используется Connect после вызова IOCtrlSocket, а в другом - WSAAsyncSelect.
Что из этого лучше использовать? Или это вообще несвязанные между собой вещи?
Recart вне форума Ответить с цитированием
Старый 28.11.2011, 19:46   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Что из этого лучше использовать?

дело вкуса, вместо WSAAsyncSelect() достаточно простого select()
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 28.11.2011, 19:59   #5
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Попробовал запихнуть в программы неблокирующие сокеты.

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
WSAStartup($0101, Data);
S:=Socket(AF_Inet, Sock_Stream, 0);
Addr.sin_family:=AF_Inet;
Addr.sin_port:=HToNs(3310);
Addr.sin_addr.S_addr:=htonl(InAddr_Any);
Bind(S, addr, sizeof(TSockaddr));
block:=1;
IOCtlSocket(S, FIONBIO, block);
Select(0, @fdset, nil, nil, nil);
В клиенте сделал аналогично.
Приложения вроде не зависают, но и сообщение клиент серверу не отправляет.
Recart вне форума Ответить с цитированием
Старый 28.11.2011, 20:30   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Т.е. по-вашему, если в случайном порядке набросать в коде IOCtlSocket() и select(), всё само вдруг магическим образом заработает? Может уже пора начать читать документацию по тем функциям, которые вы используете? Или будем продолжать переставлять операторы местами, пока не заработает? )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 28.11.2011, 20:47   #7
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Я про эти сокеты знаю мало чего, точнее знаю только то, что объяснял мне преподаватель.
Эта документация тока тратой времени будет. Там примеров нет (а если и есть, то мало), а без них мне всё понять будет очень трудно.
Есть у меня пример, реализованный через UDP, придётся его разбирать и вникать самому (как обычно).
Спасибо за помощь.
Recart вне форума Ответить с цитированием
Старый 28.11.2011, 20:58   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Задача состоит в том, чтобы написать очень элементарное приложение на сокетах (Winsock) для понимания их работы.

должен признаться, у вас достаточно странный подход к решению поставленной задачи )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 28.11.2011, 21:43   #9
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Спасибо. А как ещё можно понять принцип работы сокетов, кроме как не на примере?
Итоговая задача более сложная, поэтому надо начинать с малого.
Recart вне форума Ответить с цитированием
Старый 28.11.2011, 23:05   #10
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от Recart Посмотреть сообщение
Спасибо. А как ещё можно понять принцип работы сокетов, кроме как не на примере?
Итоговая задача более сложная, поэтому надо начинать с малого.
Прочитать пару книг по этой теме, разобраться в том что и как работает, а уж потом "смотреть на примере", так сказать, вникая в суть прочитанного. Насколько мне известно, так получаются более глубокие познания)
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ms sql+delphi, клиент-серверное приложение denis_stell БД в Delphi 4 03.11.2011 20:06
Клиент-серверное приложение Granus C/C++ Сетевое программирование 2 20.07.2011 02:07
клиент-серверное приложение roxy1807 БД в Delphi 0 19.04.2011 19:02
Простейшее клиент-серверное приложение в Delphi 2009 RNT Работа с сетью в Delphi 15 21.11.2010 19:08
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18