Новичок
Профиль
Группа: Участник
Сообщений: 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++ Помогите люди
|