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

Вниз

Помогите разобраться с приемом 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.117 c
2-1163508999
Дева
2006-11-14 15:56
2006.12.03
древовидная структура базы данных


2-1163771014
novill
2006-11-17 16:43
2006.12.03
Как сделать, чтобы при создании стандартной формы свойство


6-1152557652
VajVajVaj
2006-07-10 22:54
2006.12.03
как отделить аттачмент?


15-1163581041
ANB
2006-11-15 11:57
2006.12.03
Oracle vs Sybase


15-1163255455
homm
2006-11-11 17:30
2006.12.03
WWW: Оцените пожалуйста проект





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