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

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

Клиент-сервер на WinSock [D5, D6, D7, WinXP]


Jetus ©   (2004-10-24 11:51:00) 

Уважаемые мастера! Как написать серверную часть программы, которая будет принимать текстовые сообщения на протоколе UDP средствами WinSock?
 Клиентскую часть, которая будет отравлять Broadcast-сообщения я осуществляю так:

procedure Send(Text: String);
var
 Init: TWSAData;
 SockOpt: BOOL;
 Sock: TSocket;
 Target: TSockAddrIn;
 Data: PChar;
begin
 WSAStartup($101,Init);
 Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
 SockOpt:=TRUE;
 SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST, PChar(@SockOpt),SizeOf(SockOpt)) ;
 Target.sin_port:=htons(8167);
 Target.sin_addr.S_addr:=INADDR_BROADCAST;
 Target.sa_family:=AF_INET;
 Data := PChar(Text);
 SendTo(Sock,Data,Length(Data),0,Target,SizeOf(Target));
 WSACleanup;
end;


Verg   (2004-10-25 18:58:00) [1]


> Так получается, что обработку принятия сообщений надо ставить
> в цикле?

В смысле по таймеру?

Можно и в цикле. Можно по-разному. Смотря какие условия, какие требования.

1. ioctl(s, FIONREAD,....) в цикле по таймеру
2. ioctl(s, FIONBIO,.....) (неблок реж.) а затем recvfrom с получением EWOULDBLOCK в случае неготовности данных... опять в же цикле по таймеру...
3. отдельный поток просто с recvfrom.... или в кобинации с 1, 2
4. WSAAsyncSelect - для оконных WIN32 приложений или так или иначе воспроизводящих их ф-ционал. и/или в комбинации с 1,2,3
5.  WSAEventSelect - это Win32  c Winsock2 с комбинацией с ...
и т.д. и.т.д .......


Jetus   (2004-10-25 08:09:00) [2]

Так получается, что обработку принятия сообщений надо ставить в цикле? Или как иначе узнать, что сообщение уже пришло? Напиши, пожалуйста, небольшой кусок кода-примера, если не сложно.


Verg   (2004-10-24 13:54:00) [3]

Исправь для начала ошибки в своей "клиентской" части:

> SendTo(Sock,Data,Length(Data),0,Target,SizeOf(Target));


Data - это PChar, т.е. просто указатель, т.е. ничем по-сути не отличается от pointer. Так кому же его значение нужно на "той стороне", на другом компе, в другом процессе(приложении)?

Тебе же надо (наверно) передать то, на что он указывает в процессе клиента.
Т.е.

>  SendTo(Sock,pchar(Text)^,Length(Text),0,Target,SizeOf(Target));


Сокетам назначь локальный адрес (т.е. IP + PORT, обычно это INADDR_ANY И нужный тебе порт, в товоем случае 8167) при помощи bind и принимай с них данные (recvfrom)- вот и вся "серверная" часть.


Наверх

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