Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

Клиент-сервер на 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.04 c
3-1102728513
ganda
2004-12-11 04:28
2005.01.16
объединение несколько БД в одну таблицу


14-1103720355
Kerk
2004-12-22 15:59
2005.01.16
Я плакал!


3-1102693499
Fedor
2004-12-10 18:44
2005.01.16
Вычисляемые поля


1-1104277153
Евгений2
2004-12-29 02:39
2005.01.16
Можно ли ВООБЩЕ данный участок кода сделать проще: без copy, val?


9-1096925934
Jack
2004-10-05 01:38
2005.01.16
опять по GLScene ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский