Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.033 c
3-1102849364
able
2004-12-12 14:02
2005.01.16
SELECT по нескольким полям


14-1104077438
maxz
2004-12-26 19:10
2005.01.16
цитаты про вино


1-1104751746
t4
2005-01-03 14:29
2005.01.16
ShellListView


14-1103707677
infom
2004-12-22 12:27
2005.01.16
Играете ли вы на работе в Counter Strike ?


3-1103184700
cad2206
2004-12-16 11:11
2005.01.16
Ошибка в SQL запросе?!




   Наверх