Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Подскажите пожалуйста принцип работы написания


Автор: Zmeyka 2.5.2006, 19:57
Не знаю как правильно будет сказать, но может быть подскажете принцип организации серверного сокета? Уже неделю мучаюсь никак не запустить сокет на прослушивание...


До чего дошел... не знаю правильно или нет, но всеже...

1) Инициализация WSAStartUp..

2) Создаю сокет
(Socket1:TSocket   SockAddr:TSockAddr;)

Socket1:=Socket(Internet,Stream,0);
FillChar(SockAddr,SizeOf(SockAddr),0);
SockAddr.Sin_Family:=Internet;
SockAddr.Sin_Port:=Htons(80);


3) Вроде как прослушиваю сокет (точнее пытаюсь)
(Pr,Pr1:Integer)

Pr:=Bind(Socket1,SockAddr,SizeOf(SockAddr));
Pr1:=Listen(Socket1,1);

До этого момента по крайней мере ошибок не выдает...

4) Далее как я понял надо использовать функцию Accept
И пробую это делать:

Pr3:=Accept(Server,Nil,nil);

Вот с фуекцией Accept Самые непонятки... как я понял из примеров, второй параметр функции Accept это переменная Record типа TSockAddr и там должны отображаться данные клиента если есть соединение..., но сколько не бился, так и не смог задать эту переменную... дельфя все рукагется о несоответствии типов.

Может кто подскажет убогому, правильную последовательность действий при создании серверного сокета и в какие функции и какие даные передавать?

Кроме всего прочего никак не пойму: Каким образом сокет постоянно висит на прослушивании? Он же 1 раз запускается и вырубается через какое то время? 
Пробовал зацикливать, но тогды приложение виснет черзе некоторое время...

 

Автор: Romikgy 2.5.2006, 23:31
1. запускаешь листен, и ты должен как то среагировать на само подключение , если оно произошло только тогда вызывать нужно
Цитата(Zmeyka @  2.5.2006,  18:57 Найти цитируемый пост)
Pr3:=Accept(Server,Nil,nil);

Код

The Windows Sockets listen function establishes a socket to listen for an incoming connection.

int listen (

    SOCKET s,    
    int backlog    
   );    
 

Parameters

s

[in] A descriptor identifying a bound, unconnected socket.

backlog

[in] The maximum length to which the queue of pending connections can GROW. If this value is SOMAXCONN, then the underlying service provider responsible for socket s will set the backlog to a maximum "reasonable" value.


Цитата(Zmeyka @  2.5.2006,  18:57 Найти цитируемый пост)
Он же 1 раз запускается и вырубается через какое то время? 


Цитата(Zmeyka @  2.5.2006,  18:57 Найти цитируемый пост)
Listen(Socket1,1);

после первого же подключения у тя очередь заканчивается.

Цитата(Zmeyka @  2.5.2006,  18:57 Найти цитируемый пост)
Pr3:=Accept(Server,Nil,nil);

Вот с фуекцией Accept Самые непонятки... как я понял из примеров, второй параметр функции Accept это переменная Record типа TSockAddr и там должны отображаться данные клиента если есть соединение..., но сколько не бился, так и не смог задать эту переменную... дельфя все рукагется о несоответствии типов.

эти параметры заполняет система, в них надо указать место куда писать , если  там нил ,значит те эти данные не надо 

Автор: Zmeyka 3.5.2006, 18:43
не понял... можно еще раз?

WSAStartUp($101,WSAData)=0;
Socket1:=Socket(2,1,0);
SockAddr.Sin_Family:=2;
SockAddr.Sin_Port:=80;
Pr1:=Bind(Socket1,SockAddr,SizeOf(SockAddr));
Pr2:=Listen(Socket1,1);

>>1. запускаешь листен, и ты должен как то среагировать на само >>подключение , если оно произошло только тогда вызывать нужно >>Accept.

Дык никакого подключения-то не происходит...
Bind и Listen всегда выдают -1, пробую зациклить эти Bind и Listen и приложение виснет.
Или с Локалхоста оно не подконектиться к этому сокету?

 

Автор: Zmeyka 3.5.2006, 22:04
Мде... не знаю почему но заработало.... по крайней мере коннект появился... извиняюсь за беспокойство. Сенк за помощь.

 

Автор: Romikgy 3.5.2006, 23:17
Цитата(Zmeyka @  3.5.2006,  17:43 Найти цитируемый пост)
Bind и Listen всегда выдают -1

Код

If no error occurs, bind returns zero. Otherwise, it returns SOCKET_ERROR, and a specific error code can be retrieved by calling WSAGetLastError.

Цитата(Zmeyka @  3.5.2006,  21:04 Найти цитируемый пост)
 Сенк за помощь.

Пжалста smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)