Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как обратися к сокету зная SocketHandle [D5, WinXP]


user51 ©   (2005-12-12 16:41:00) 

Имеется приложение котое имеет множество входящих и исходящих соединений оновременно. используются компонетны
ClientSocket ServerSocket (stNonBlocking)
У каждого соединения знаю SocketHandle
как обратися к сокету зная SocketHandle независимо от того сервер это или клиент. Например полать данные

 Socket.Sendbuf(sbuf,sbuf_len);
^^^^^^^^^^^^^^^^^^^^^^
куда тут всунуть SocketHandle чтобы послать данные в нужный
мне сокет.


Digitman   (2005-12-22 13:17:00) [1]


> Ускорение прекрасное


лладно хоть не преинфракрасное


MultIFleX   (2005-12-22 13:02:00) [2]

Прально делаешь, в связи с оптимизацией работы сервера (моей проги ) тоже перешел с АйПи и ХостНейма на дескриптор сокета. Ускорение прекрасное...


Digitman   (2005-12-13 17:42:00) [3]

глупо и чревато использовать WinsockAPI при наличии соответствующего Делфи-класса


user51   (2005-12-13 14:23:00) [4]

Все ребята помогли мне - разобрался
send(SocketHandle, Buf, Count, 0);
вроде бы покатило буду дальше разбиратся

Б О Л Ь Ш О Е    С П А С И Б О


user51   (2005-12-13 14:23:00) [5]

Все ребята помогли мне - разобрался
send(SocketHandle, Buf, Count, 0);
вроде бы покатило буду дальше разбиратся

Б О Л Ь Ш О Е    С П А С И Б О


Digitman   (2005-12-13 13:59:00) [6]


> необходимый патнер посоединился восьмым


Да хоть столохматым !

При этом возникло событие OnClientConnect и в метод его обработки 2-м параметром тебе был передан объект класса TCustomWinSocket, обратившись к send-методам которого в любой момент позже ты будешь передавать данные именно тому клиенту, подсоединение которого и вызвало первоначально то самое событие OnClientConnect

В дальнейшем этот объект будет фигурировать как в списке ActiveConnections (неважно под каким номером), так и 2-м параметром любого события сервера

Без перебора же объектов в каком бы то ни было списке (хоть в ActiveConnections хоть в своем собственном) для поиска в нем нужного объекта никак не обойтись - в ЛЮБОМ случае объект д.б. идентифицирован по какому-либо уник.признаку, будь то хоть хэндл хоть еще что-то


user51   (2005-12-13 13:28:00) [7]

>Slym ©  
send(SocketHandle, Buf, Count, 0);
Да верно Slym понял правильно  типа этого и   надо  вот я и спрашиваю есть ли такая стандартная штука. Кинте примерчик если кто знает.

to Digitman ©  

>за "связь с партнером" и на клиентской и на серверной стороне отвечают >объекты класса TCustomWinSocket, тот самый который возвращает св-во >ClientSocket.Socket и те самые что содержатся в списке ServerSocket.>Socket.ActiveConnections
Все верно  но что делать если необходимый патнер посоединился восьмым к сервер сокету а потом парочку которые  подсоединились до него отсоединились. Вот как имменно ему послать сообщение без перебора всех сервер сокетов. ip и порт его соответсвенно мы знаем ?
Подскажи конкретно если знаешь


Slym   (2005-12-13 11:44:00) [8]

Digitman ©   (13.12.05 11:17) [5]
Человек хочет... Даду :)
send(SocketHandle, Buf, Count, 0);
recv(SocketHandle, Buf, Count, 0);
или ReadFile/WriteFile...


Digitman   (2005-12-13 11:17:00) [9]


> user51   (13.12.05 10:56) [4]


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

за "связь с партнером" и на клиентской и на серверной стороне отвечают объекты класса TCustomWinSocket, тот самый который возвращает св-во ClientSocket.Socket и те самые что содержатся в списке ServerSocket.Socket.ActiveConnections


user51   (2005-12-13 10:56:00) [10]

соединение установлено (неважно к тебе подсоединилисть или подсоединился). Оно прописывается например в массив который имеет
Имя партнера и хендл. Когда надо нужному партнеру послать данные
чтоб не парится над тем он к тебе подсоединился и какому сокету ( имеется ввиду номер коннекшена ServerSocket1.Socket.Connections[0].Sendbuf(sbuf,sbuf_len);) или ты к ему и с помощью какго нибудь  из ста   ClientSocket1..ClientSocket100 Просто берешь номер хендла сокета и посылаешь в него данные и все
Пример Socket.[суда куда то хендл всунуть ]Sendbuf(sbuf,sbuf_len);
надеюсь третий раз написал более понятно.
Так кто нибудь знает как послать данные в сокет зная его хендл ???


Digitman   (2005-12-13 10:40:00) [11]

ты вообще о чем речь ведешь ?
о серверной стороне соединения или о клиентской ?


user51   (2005-12-13 09:31:00) [12]

to Digitman
>нахрен он тебе сдался, этот SocketHandle ?
>что, идентификация партнера по соединению по его IP+порт уже не модна ?

ну-ну ни как послать этому партнеру данные - перебирать сотню сокетов
серверных и сотню клиенских пока не наткнешся на нужный ? И процедура
будет не очень то универсальной надо писать то
ClientSocket1.Socket.Sendbuf(sbuf,sbuf_len);
to
ServerSocket1.Socket.Connections[0].Sendbuf(sbuf,sbuf_len);

да и как перебрать клиентские сокеты и как в процедуре к ним обратися например как послать в ClientSocket1 потом в ClientSocket13 что писать

if i=1 then ClientSocket1.Socket.Sendbuf(sbuf,sbuf_len);
if i=2 then ClientSocket2.Socket.Sendbuf(sbuf,sbuf_len);
....
if i=13 then ClientSocket1.Socket.Sendbuf(sbuf,sbuf_len);

у меня мысль была хранить допустим имя партнера и его хандл в массиве и когда надо послать в сокет с нужным хендлом данные и не надо перебирать сокеты и думать ты к нему подсоединился или он к тебе  просто пишешь Socket.[суда куда то хендл всунуть ]Sendbuf(sbuf,sbuf_len);

Может я ошибаюсь подскажите тогда


Digitman   (2005-12-12 18:15:00) [13]

нахрен он тебе сдался, этот SocketHandle ?
что, идентификация партнера по соединению по его IP+порт уже не модна ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо