Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с сокетами: один и тот же кусок кода, в C++ работает, а в Delphi нет 
:(
    Опции темы
yuansw
Дата 7.12.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



Проблема с сокетами: один и тот же кусок кода в C++ работает, а в Delphi нет

Код на С++

Код

#include <windows.h>
#include <winsock.h>

#include "ss.h"

extern "C" BOOL WINAPI /*__export*/
DllEntryPoint(HINSTANCE hInst, DWORD fdwReason, LPVOID) {
switch( fdwReason ) {
    case DLL_PROCESS_ATTACH:
      Rec=(char*)malloc(262144);*Rec=0;
      break;

    case DLL_PROCESS_DETACH:
      {
     // FreeLibrary(hLib);
      free(Rec);
      }
      break;
  }
  return TRUE;
}


char* GetString(SOCKET s) {
    char InBuff[4096];
    int cnt=1;
while (cnt!=0) {
        memset(&InBuff,0,4096);
        cnt=recv (s, (char*)&InBuff, 4095,0);
        strcat(Rec,InBuff);
}
    return Rec;
}


int /*BCDLL_EXP*/__declspec( dllexport ) __stdcall OpenURL(char *host, int port, char *query, /*SOCKET s,*/ char* &Rec) {
    struct sockaddr_in ssin;
    struct hostent* hp;
   WSADATA lpWSAData;
   int s = 0;

    if (WSAStartup(MAKEWORD(1, 1), &lpWSAData)!=0) return(1);
    // ╧юыєўрхь IP яю шьхэш
    if ((hp=gethostbyname(host))==NULL) return(1);

    memset ((char *)&ssin, 0, sizeof(ssin));
    ssin.sin_family = AF_INET;
    ssin.sin_addr.s_addr = htonl(INADDR_ANY);
    ssin.sin_port = 0;
    bind (s, (struct sockaddr *)&ssin, sizeof(ssin));

    s=socket(AF_INET, SOCK_STREAM, 0);
    if (s==INVALID_SOCKET) return(4);

    ssin.sin_family = AF_INET;
    ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
    ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
    ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
    ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
    ssin.sin_port = htons(port);

    if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) return(3);

    send(s,query,strlen(query),0);

  Rec = GetString(s);



    WSACleanup();
    return(0);
    }





код из заголовочного файла


Код

CFUNC int /*BCDLL_EXP*/ __declspec( dllexport ) __stdcall OpenURL(char *host, int port, char *query, /*SOCKET s,*/ char* &Rec);
char* Rec;




Код на Delphi

Код

var
  WSADATA: TWSAData;
  s: TSocket;
  rec: Pchar;
  //rec: array [0..262144] of char;
  maxsymbols: DWORD= 160;

procedure GetString(s: TSocket);
var
  InBuff: array[0..4096] of char;
  cnt: Integer;
//  a: Pchar;
begin
  cnt:= 1;
//  a:= InBuff;
  while cnt <>0 do begin
    //memset(&InBuff,0,4096);
    FillChar(InBuff,4096,0);
    cnt:= recv (s, InBuff, 4095,0); [color=red]//  <---  В ЭТОМ МЕСТЕ ПРОГРАММА ЗАВИСАЕТ!!!!!![/color]
    strcat(Rec,@InBuff);
  end;
end;


function OpenURL(host: PChar; port: Integer; query: PChar): Integer;
var
  ssin: sockaddr_in;
  hp: phostent;
begin
  if WSAStartup(MAKEWORD(1, 1), WSAData)<>( 0) then begin Result:= 1; Exit; end;
    // ╧юєўрхь IP яю шьхэш
  hp:= gethostbyname(host);
  if hp= nil then begin Result:= 1; Exit; end;

  FillChar(ssin,sizeof(ssin),0);
  //memset ((char *)&ssin, 0, sizeof(ssin));
  ssin.sin_family:= AF_INET;
  ssin.sin_addr.s_addr:= htonl(INADDR_ANY);
  ssin.sin_port:= 0;
  bind (s, ssin, sizeof(ssin));

  s:= socket(AF_INET, SOCK_STREAM, 0);
  if s = INVALID_SOCKET then begin Result:=4; Exit; end;

  ssin.sin_family:= AF_INET;
  ssin.sin_addr.S_un_b.s_b1:= hp^.h_addr^[0];
  ssin.sin_addr.S_un_b.s_b2:= hp^.h_addr^[1];
  ssin.sin_addr.S_un_b.s_b3:= hp^.h_addr^[2];
  ssin.sin_addr.S_un_b.s_b4:= hp^.h_addr^[3];
  ssin.sin_port:= htons(port);

  if connect(s, ssin, sizeof(ssin)) = -1 then begin Result:= -1; Exit; end;

  send(s,query,strlen(query),0);

  GetString(s);

  WSACleanup;
  Result:= 0;
end;          




В коде на Delphi указано где программа зависает. Что же может быть? Из-за зависания проседуру OpenURL(...) приходиться использовать из DLL на C++

Помогите люди
PM MAIL   Вверх
jsa
Дата 8.12.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: 1
Всего: 20



Цитата

Код

ssin.sin_addr.s_addr:= htonl(INADDR_ANY);
...
s:= socket(AF_INET, SOCK_STREAM, 0);


похоже на броадкастовое собщение по udp (хотя я могу ошибаться) а если это так, то скороее всего ответа и не будет, проще использовать wininet


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.