Главная страница
    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.036 c
14-1104219018
NewDelpher
2004-12-28 10:30
2005.01.16
Солдаты Великой Отечественной


1-1103979366
Russko
2004-12-25 15:56
2005.01.16
Выявление ошибки


1-1104687802
NEEDHelp
2005-01-02 20:43
2005.01.16
Kak mozhno zapustit programu 4tob ona bila vidna okolo 4asov?


14-1104139505
Hypercube
2004-12-27 12:25
2005.01.16
Ющенко победил


9-1096272516
Werwolf
2004-09-27 12:08
2005.01.16
Вопрос ко всем игроделам





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский