![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с RecvFrom [D6, Win95/98, WinXP]
FireMan_Alexey © (2004-05-16 11:13:00)Ув. Мастера!
У меня проблема с RecvFrom.
Function TUDP.RecieveFrom;
Var
Addr:TSockAddr;
Size:Integer;
Begin
Size:=SizeOf(Addr);
{Addr.sin_family:=AF_INET;
Addr.sin_port:=HtoNS(9000);
Addr.sin_addr.S_addr:=INADDR_ANY;}
Result:=RecvFrom(FSocket,Buff,Count,0,Addr,Size);
{Здесь вылетает ошибка 10062-неправильно указанный параметр как я понял}
If Result=SOCKET_ERROR Then
Begin
FError:=WSAGetLastError;
Exit;
End;
End;
Я просто не пойму, что я сделал неправильно?
FireMan_Alexey (2004-05-16 12:17:00) [21]А при создании INADDR_BROADCAST вылетает ошибка 10049 - некоректный адрес!
FireMan_Alexey (2004-05-16 12:13:00) [22]Да ты правильно понял!
webfile.ru/8465
Verg (2004-05-16 12:09:00) [23]
> [6] FireMan_Alexey © (16.05.04 11:56)
На http://webfile.ruвыложи.
Verg (2004-05-16 12:08:00) [24]Я понял, что FSocket, который в bind. это тот же FSocket, который в SendTo.
Так?
Verg (2004-05-16 12:06:00) [25]
> [5] FireMan_Alexey © (16.05.04 11:54)
> Что именно ты имееш ввиду?
> У меня при создании сервера адрес INADDR_ANY, а при отсылки
> INADDR_BROADCAST.
Да получается, что у датаграммы адрес назначения (DST) =INADDR_BROADCAST, а вот адрес источника(SRC)=INADDR_ANY (т.е. 0). Т.о. recvfrom, которая и вытаскивает тебе SRC из датаграммы вынуждена вернуть некорректный результат в адресе. Вот она и сообщает
10062 = WSAELOOPCannot translate name.
FireMan_Alexey (2004-05-16 11:56:00) [26]Если можно, укажи свое мыло и я вышлю весь код программы, так будет легче обсуждать
FireMan_Alexey (2004-05-16 11:54:00) [27]Что именно ты имееш ввиду?
У меня при создании сервера адрес INADDR_ANY, а при отсылки
INADDR_BROADCAST.
Verg (2004-05-16 11:51:00) [28]Да, похоже проблема с тем, что ты используешь сокет с локальным адресом INADDR_ANY для отсылки датаграмм.
FireMan_Alexey (2004-05-16 11:47:00) [29]Procedure TUDP.WndProc;
Begin
Case M.Msg of
WM_QUERYENDSESSION:;
UDP_MESSAGE:
Begin
FError:=WSAGetSelectError(M.LParam);
If FError<>0 Then
Begin
Error;
End;
Case WSAGetSelectEvent(M.LParam) Of
FD_READ:
If Assigned(FERead) Then
FERead(Self);
FD_WRITE:
If Assigned(FEWrite) Then
FEWrite(Self);
End;
End;
End;
End;
А в обработчике:
Procedure TMain_.Read;
Var
S,IP:String;
Size:Integer;
Begin
//
Size:=TUDP(Sender).RecieveLength;
Size:=TUDP(Sender).RecieveFrom(S[1],Size,IP);
If TUDP(Sender).FError<>0 Then
Memo1.Lines.Add(IntToStr(TUDP(Sender).FError));
Memo1.Lines.Add('Read From: '+IP+' '+S);
End;
Verg (2004-05-16 11:37:00) [30]
> Function TUDP.RecieveFrom;
Пакажи а как и где ты вызываешь эту ф-цию.
И еще. Ты ничего не путаешь с кодом ошибки: точно WSAELOOP?
FireMan_Alexey (2004-05-16 11:18:00) [31]Да и еще создание сервера:
Procedure TUDP.OpenServer;
Begin
FSocket:=SOCKET(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
If FSocket=Invalid_Socket Then
Begin
FError:=WSAGetLastError;
Error;
End;
FAddr.sin_family:=AF_INET;
FAddr.sin_port:=HtoNS(Port);
FAddr.sin_addr.S_addr:=INADDR_ANY;
FError:=Bind(FSocket,FAddr,SizeOf(FAddr));
If FError=SOCKET_ERROR Then
Begin
FError:=WSAGetLAstError;
Error;
End;
WSAAsyncSelect(FSocket,FHandle,UDP_MESSAGE,FD_READ or FD_WRITE);
End;
И посылка широковещательных датаграмм:
Function TUDP.SendBroadCast;
Var
Addr:TSockAddr;
Bol1:Bool;
Begin
If Count>512 Then
Begin
FError:=-1;
Result:=-1;
Exit;
End;
Bol1:=True;
Addr.Sin_Family:=AF_INET;
Addr.Sin_Port:=HtoNS(Port);
Addr.Sin_Addr.S_addr:=INADDR_BROADCAST;
SetSockOpt(FSocket,SOL_SOCKET,SO_BROADCAST,PChar(@Bol1),SizeOf(Bol1));
Result:=SendTo(FSocket,Buff,Count,0,Addr,SizeOf(Addr));
If Result=SOCKET_ERROR Then
Begin
FError:=WSAGetLastError;
End;
End;