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


Автор: bokul 27.6.2007, 04:31
Знаю, после прочтения заголовка хочется послать тему куда подальше... ну, например, в  Delphi: Сети. Но есть одна оговорка - на чистом WinApi.  Так что, не судите строго - выбор между ветками был не из легких..

Конкретно интересует реализация обмена информации между двум приложениями в локальной сети. Возможно ли это реализовать только средствами WinApi? Какие именно надо использовать протоколы и что вообще надо использовать? Зашел на msdn в раздел Networking и утонул, с чего начать? 

Автор: MetalFan 27.6.2007, 07:52
Цитата(bokul @  27.6.2007,  05:31 Найти цитируемый пост)
с чего начать?

http://narod.yandex.ru/cgi-bin/yandsearch?user=delphiworld&text=WSAStartup&where=2  smile 

http://delphiworld.narod.ru/base/sockets1.html
http://delphiworld.narod.ru/base/sockets2.html
http://delphiworld.narod.ru/base/sockets3.html
http://delphiworld.narod.ru/base/sockets4.html

Автор: bokul 27.6.2007, 18:29
Спасибо, буду изучать. Только вопрос, не помешает ли моим экспериментам тот факт, что сеть работает через роутер? Меняет ли это способ роботы с ней?

Автор: Coder 28.6.2007, 02:37
Цитата

Только вопрос, не помешает ли моим экспериментам тот факт, что сеть работает через роутер?

Клиентской программе наврятли. А вот серверу, которой будет слушать порт, скорее всего помешает.

Автор: MetalFan 28.6.2007, 08:47
Цитата(Coder @  28.6.2007,  03:37 Найти цитируемый пост)
скорее всего помешает

если порты на рутере не "открыты"....

Автор: bokul 28.6.2007, 23:31
Почитал, поразбирался, покодил - не работает прога. В связи этим есть вопросы. Как я понимаю, самая простая модель сокетного клиент-серверного приложения такова: клиент создает свой сокет(ClinetSock1), через который соединяется с сервером. Сервер, в свою очередь, прослушивает свой сокет(ServerSock1), созданный ранее, и, допустим, принимает запрос клиента, создавая этим самым себе новый сокет(ServerSock2) для общения с клиентом. Вопрос: на какой сокет должен слать дальше данные сервер, и из какого принимать? Те же вопросы и для клиента..

Автор: bokul 29.6.2007, 03:50
 smile Я - разобрался! Код - заработал! Спасибо за ответы! 

PS http://gamedev.ru/articles/?sect=8 - рекомендую по сабжу, правда на С, но все отлично описано.

Автор: bokul 29.6.2007, 21:09
Что касается роутера, вы оказались правыми :  программа тестировалась в интернете и при запуске клиента все отлично работало, сервера - нет. Чтобы исправить такой ход дел, надо открыть порт, используемый сервером, на роутере? Где вообще можно почитать о работе сети, чтобы не было непонятных моментов при работе с сокетами?

Автор: bokul 3.7.2007, 01:42
А как сделать поддержку одновременного приема и отсылки данных в клиент-сервере? Т.е. мы не знаем заранее какая будет очередность в передачи данных: может быть мы будем только получать пакеты, а может и только отправлять, или же все в перемешку. Цикл вроде:
Код


Код

repeat
        send(bla-bla);
        recv(bla-bla);
until false;


не подходит, даже если будет проверки, ведь recv блочная функция и пока не придут данные, прога ни на команду не сдвинется,  а может понадобится отправка данных в этот момент. Потоки разрешат проблему?

Автор: bokul 3.7.2007, 18:56
АУУУУУУУУУ! Уделите, пожалуйста, минутку своего время - 5 дней и никакой реакции, или тут не принято отвечать на вопросы новичков?

Автор: bokul 4.7.2007, 07:11
 smile 

Автор: MetalFan 4.7.2007, 08:06
видимо необходимо проверить наличие данных во входном буфере перед вызовом recv.
либо вынести работу в отдельный поток...
про потоки есть отдельная тема
p.s. так же могу предположить (ибо сам с сокетами на WinApi не работал), что можно
"протестить" сокет на наличие данных с пом. ioctlsocket примерно так:
Код

...
ioctlsocket( hSocket, FIONREAD, lDataAmount )
...

Цитата(MSDN)

FIONREAD 
Use to determine the amount of data pending in the network's input buffer that can be read from socket s. The argp parameter points to an unsigned long value in which ioctlsocket stores the result. FIONREAD returns the amount of data that can be read in a single call to the recv function, which may not be the same as the total amount of data queued on the socket. If s is message oriented (for example, type SOCK_DGRAM), FIONREAD still returns the amount of pending data in the network buffer, however, the amount that can actually be read in a single call to the recv function is limited to the data size written in the send or sendto function call.


Автор: bokul 4.7.2007, 17:53
 smile Спасибо, только Requirements у этой функции и оказывается, что XP для сервера не подходит, а надо именно он (или оно smile ).

Цитата

Requirements
Client  Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.

Server  Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server.

Автор: MetalFan 4.7.2007, 21:09
bokul, а проверил? мало-ли что написано)

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