Форум: "Сети";
Текущий архив: 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