[ошибка с сокетами?]Закачка CDR'а

Для тех, кто хочет сделать мир лучше.
Закрыто
Сообщение
Автор
Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#1 Сообщение 08.09.2008, 18:40

Итак, посмотрев исходники, выкинутые в свет одни хорошим человеком (не с нашего форума), решил сделать закачку BLOB-файла своим кодом, что бы интегрировать такую возможность в MiniSteam. Однако столкнулся с одной серьезной проблемой - при получении размера скачиваемого файла программа сообщет, то процедура приема "вылетела" с ошибкой :(
Привожу свой код:
[spoiler=""Код""]

Код: Выделить всё

function TCDRDownload.Connect(sckConnect: TSocket; cszIP: pChar; uPort: uint): boolean;
var
  AddrSock: TSockAddrIn;
begin
  result:=false;

  AddrSock.sin_family:=AF_INET;
  AddrSock.sin_port:=htons(uPort);
  AddrSock.sin_addr.S_addr:=inet_addr(cszIP);
  {if AddrSock.sin_addr.S_addr=-1 then
    AddrSock.sin_addr.S_addr:=GetHostByName('gds1.steampowered.com').h_addrtype; }

  if AddrSock.sin_addr.S_addr=INADDR_NONE then
    Exit;

  if WinSock.connect(sckConnect, AddrSock, sizeof(AddrSock))=SOCKET_ERROR then
    Exit;

  result:=true;
end;
var
  Host: PHostEnt;
  bAccepted: boolean;
  uPacketSize: uint;
  sckGDS: TSocket;
  p, szData: pChar;
  tmp_4: ulong;
  tmp_1: byte;
begin
  if not Connect(sckConnect, '207.173.177.11', 27030) then
    Exit;
  if send(sckConnect, GD_CLIENTVER, 4, 0)=SOCKET_ERROR then
    Exit;
  if recv(sckConnect, bAccepted, 1, 0)=SOCKET_ERROR then
    Exit;
  if not bAccepted then
    Exit; 
  tmp_4:=$00000001;
  if send(sckConnect, tmp_4, 4, 0)=SOCKET_ERROR then
    Exit;
  tmp_1:=$03;
  if send(sckConnect, tmp_1, 1, 0)=SOCKET_ERROR then
    Exit;
//здесь идет вылет:
  if recv(sckConnect, uPacketSize, 4, 0)=SOCKET_ERROR then
    Exit;
  uPacketSize:=ntohl(uPacketSize);
....
end;
[/spoiler]
Кто разбирается в этом, сообщите, где у меня что неправильно?
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

user
Нович0к
Нович0к
Сообщения: 25
Зарегистрирован: 13.12.2005

#2 Сообщение 08.09.2008, 21:44

я в своем последнем сетевом проекте делал так. все работало.

собрал все в кучу с разных процедур. посмотри, вдруг пригодится :)

[spoiler=""кодес""]

Код: Выделить всё

var
  _Addr: string;
  _Port: Integer;
  _ClientSocket: TSocket;
  _ServerAddr: sockaddr_in;
begin
  _ClientSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
  _ServerAddr.sin_family:=AF_INET;
  _ServerAddr.sin_addr.S_addr:=htonl(INADDR_ANY);
  _ServerAddr.sin_port:=htons(_Port);
  _ServerAddr.sin_addr:=LookUpName(_Addr);
  WSAAsyncSelect(_ClientSocket,Handle,WM_USER,FD_READ);  //использовал асинхронные неблокирующие сокеты. принимал данные по виндовс месседж WM_USER
  connect(_ClientSocket,_ServerAddr,SizeOf(_ServerAddr));
end;

function LookUpName(S_Addr: AnsiString): TInAddr;
var
  Host: PHostEnt;
  Addr: TInAddr;
begin
  Host:=gethostbyname(PAnsiChar(S_Addr));
  with Host^,Addr do
  begin
    S_un_b.s_b1:=h_addr^[0];
    S_un_b.s_b2:=h_addr^[1];
    S_un_b.s_b3:=h_addr^[2];
    S_un_b.s_b4:=h_addr^[3];
  end;
  Result:=Addr;
end;

прием данных :
procedure SocketMsg(var msg: TMessage);
begin
  case msg.LParam of
  FD_READ: _Recv(msg.WParam);
  end;
end;

procedure _Recv(RecvSock: TSocket);
var
  _buff: array[0..50000] of AnsiChar;
begin
  FillChar(_buff,SizeOf(_buff),0);
  recv(RecvSock,_buff,SizeOf(_buff),0);
end;
[/spoiler]

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#3 Сообщение 08.09.2008, 22:51

Может uPacketSize как long?

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#4 Сообщение 10.09.2008, 10:01

eldest писал(а):Может uPacketSize как long?
Может. Завтра проверю :)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Закрыто