Форум: "Сети";
Текущий архив: 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.45 MB
Время: 0.042 c