Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с RecvFrom [D6, Win95/98, WinXP]


Страницы:   1 2

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  = WSAELOOP   Cannot 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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо