Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Клиент-сервер на WinSock   Найти похожие ветки 

 
Jetus ©   (2004-10-24 11:51) [0]

Уважаемые мастера! Как написать серверную часть программы, которая будет принимать текстовые сообщения на протоколе 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-24 13:54) [1]

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

> 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)- вот и вся "серверная" часть.


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

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


 
Verg ©   (2004-10-25 18:58) [3]


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

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

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

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 с комбинацией с ...
и т.д. и.т.д .......



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.023 c
1-1104141949
Vyacheslav
2004-12-27 13:05
2005.01.16
Как определить тип операционной системы ???


1-1104681424
CTAPbIi
2005-01-02 18:57
2005.01.16
Использование DrawText в обработчике DrawColumnCell в DBGrid


14-1103916586
olookin
2004-12-24 22:29
2005.01.16
И еще вопрос...


14-1103961763
Neznaika
2004-12-25 11:02
2005.01.16
Кто-нибудь знает когда заработает "кладовка"?


3-1102885803
SergP
2004-12-13 00:10
2005.01.16
ADOQuery. Подмена данных при их получении.