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

Вниз

Помогите разобраться с приемом UDP пакетов   Найти похожие ветки 

 
begginer   (2006-07-11 18:58) [0]

Уважаемые Мастера! Пытаюсь написать клиент к чату, не могу никак получить пакеты , которые приходят на заданный порт UDP... Пытаюсь так:


 WSAStartup(MakeWord(1, 0), tmp);

 my_sock:=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 addr.sin_family:= AF_INET;
 addr.sin_addr.S_addr:= htonl(INADDR_ANY);
 addr.sin_port:= htons(8169);
 if bind(my_sock, addr, SizeOf(addr)) <> 0 then
   setsockopt(my_sock, SOL_SOCKET, SO_REUSEADDR, optval, optlen);

 bind(my_sock, addr, SizeOf(addr));
   
 reciev(my_sock);
...........

 procedure reciev(my_sock: TSocket);
var
 buf: PChar;
 bufsize: DWORD;
 from: sockaddr_in;
 fromlen: integer;
begin
 bufsize:= 65000;
 GetMem(buf, bufsize);
 fromlen:= SizeOf(TSockAddr);
// while true do закомментировал, т.к. неуверен нужен ли здесь цикл
// begin
 if recvfrom(my_sock, buf^, bufsize, 0, from, fromlen) = SOCKET_ERROR then
 begin
   // тут ошибка 10035
 end
 else
 ... // тут планировал обработку данных
// end;
end;



В общем кто знает, помогите пожалуйста... постоянно вылетает на ошибку 10035 (как я понял просто нет данных, т.е. пакет не пришел... но даже когда пакет приходит ошибка остается).


 
Slym ©   (2006-07-12 07:50) [1]

10035 Операция на незаблокированном сокете не может быть завершена немедленно.
var Blocking:integer;
Blocking:=0;
ioctlsocket(my_sock, FIONBIO, Blocking);
reciev(my_sock);


 
begginer   (2006-07-13 07:21) [2]

Все осталось также :( есть другие предположения? кстати ioctlsocket вызывает ошибку 10022, т.е. неправильный аргумент :( с значение Blocking > 0 все нормально, может udp сокеты не поддерживают или не нуждаются в блокировке?


 
Slym ©   (2006-07-13 08:14) [3]

Проверено, работает:
program UDP;

{$APPTYPE CONSOLE}

uses
 SysUtils,WinSock,Windows,RTLConsts;

procedure RaiseSocketError(const Op: string);
var Error:integer;
begin
 Error := WSAGetLastError;
 raise Exception.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(Error), Error, Op]);
end;

procedure RecvLoop(sock: TSocket);
const BufSize:integer=$ffff;
var
 buf: PChar;
 from: TSockAddr;
 Size,fromlen: integer;
 s:string;
begin
 GetMem(buf, bufsize);
 try
   while true do
   begin
     Size:=BufSize;
     fromlen:= SizeOf(TSockAddr);
     Size:=recvfrom(sock, buf^, Size, 0, from, fromlen);
     if Size<> SOCKET_ERROR then
     begin
       SetString(s,buf,Size);
       Writeln(s);
     end else RaiseSocketError("recvfrom");
   end;
 finally
   FreeMem(buf);
 end;
end;

var
 WSAData: TWSAData;
 sock:TSocket;
 addr:TSockAddrIn;
begin
 WSAStartup(MakeWord(1, 0), WSAData);
 sock:=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 addr.sin_family:= AF_INET;
 addr.sin_addr.S_addr:= htonl(INADDR_ANY);
 addr.sin_port:= htons(3052);
 bind(sock, addr, SizeOf(addr));
 RecvLoop(sock);
 closesocket(sock);
 WSACleanup;
end.



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

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

Наверх




Память: 0.47 MB
Время: 0.075 c
4-1153470311
Степан
2006-07-21 12:25
2006.12.03
Как убрать полосы прокрутки у ListView


1-1161688783
SlavaK
2006-10-24 15:19
2006.12.03
Делал ли кто подобный компонент или просто класс


2-1163690295
Svoja4ok
2006-11-16 18:18
2006.12.03
Просто в XLS... сбился с ног...


4-1153829366
sVic
2006-07-25 16:09
2006.12.03
Как определить владельца файла(NTFS)


15-1163493670
Проходящий мимо
2006-11-14 11:41
2006.12.03
CD, iso