Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Проблема с сокетами: один и тот же кусок кода


Автор: yuansw 7.12.2006, 11:36
Проблема с сокетами: один и тот же кусок кода в 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++

Помогите люди

Автор: jsa 8.12.2006, 16:42
Цитата

Код

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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)