Доброго времени суток господа, пишу простенький чекер логинов через веб сайт. Получаю информацию следующим способом: | Код | char* OpenURL(char *url) { WSADATA lpWSAData; SOCKET s;
// Проверим на правильность введенный адрес. // Он должен начинаться с "http://" if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) return(NULL); url+=7;
// Инициализация библиотеки Ws2_32.dll. if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(NULL);
// Получим имя хоста, номер порта и путь ----------------------------
char *http_host=strdup(url); // Имя хоста (HTTP_HOST) int port_num=80; // Номер порта по умолчанию (HTTP_PORT) char *http_path=NULL; // Путь (REQUEST_URI)
char *pch=strchr(http_host,':'); if (!pch) { pch=strchr(http_host,'/'); if (pch) { *pch=0; http_path=strdup(pch+1); } else http_path=strdup(""); } else { *pch=0;pch++; char *pch1 = strchr(pch,'/'); if (pch1) { *pch1=0; http_path=strdup(pch1+1); } else http_path=strdup("");
port_num = atoi(pch);
if (port_num==0) port_num = 80; }
// Поучаем IP адрес по имени хоста struct hostent* hp; if (!(hp=gethostbyname(http_host))) { free(http_host); free(http_path); return(NULL); }
// Открываем сокет s=socket(AF_INET, SOCK_STREAM, 0); if (s==INVALID_SOCKET) { free(http_host); free(http_path); return(NULL); } struct sockaddr_in ssin; memset ((char *)&ssin, 0, sizeof(ssin)); 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_num); printf("Conecting to %d.%d.%d.%d...",(unsigned char)hp->h_addr[0], (unsigned char)hp->h_addr[1], (unsigned char)hp->h_addr[2], (unsigned char)hp->h_addr[3]); if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) { free(http_host); free(http_path); printf("Error\n"); return(NULL); } printf("Ok\n"); char *query=(char*)malloc(2048);
strcpy(query,"GET /"); strcat(query,http_path); strcat(query," HTTP/1.0\nHost: "); strcat(query,http_host); strcat(query,"\nUser-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); strcat(query,"\nAccept: */*\n\n"); printf("%s",query); int cnt=send(s,query,strlen(query),0); free(http_host); free(http_path); free(query); if (cnt==SOCKET_ERROR) return(NULL);
cnt=1; int size=1024*1024; // 1Mb char *result=(char*)malloc(size); strcpy(result,""); char *result_ptr=result;
while (cnt!=0 && size>0) { cnt=recv (s, result_ptr, sizeof(size),0); if (cnt>0) { result_ptr+=cnt; size-=cnt; } } *result_ptr=0; WSACleanup();
return(result); }
|
Проверяю же текущее имя так: | Код | int checkName(std::string name) {
string addr = "http://rscript.org/lookup.php?type=namecheck&name="; strcat((char*)addr.c_str(),name.c_str()); std::string unv = "NOTAVALIBLE"; std::string str; char* answer = OpenURL((char*)addr.c_str()); // Sleep(10000); strcat((char*)str.c_str(),answer); if ( str.find(unv) != std::string::npos ) { bad++; return 1; } else { good++; return 0; } }
|
Так вот. Как только функция checkName возвращает значение, я получаю следующее: | Код | #0 77A05655 ntdll!RtlpSetUserPreferredUILanguages() (C:\Windows\system32\ntdll.dll:??) #1 779EDA65 ntdll!RtlInitUnicodeString() (C:\Windows\system32\ntdll.dll:??) #2 779D1A47 ntdll!KiRaiseUserExceptionDispatcher() (C:\Windows\system32\ntdll.dll:??) #3 77A066AE ntdll!RtlpSetUserPreferredUILanguages() (C:\Windows\system32\ntdll.dll:??) #4 779CA0EE ntdll!KiRaiseUserExceptionDispatcher() (C:\Windows\system32\ntdll.dll:??) #5 77996536 wtoi64() (C:\Windows\system32\ntdll.dll:??) #6 77AC98CD msvcrt!free() (C:\Windows\system32\msvcrt.dll:??) #7 00000000 0x00650000 in ??() (??:??) #8 00000000 0x00000000 in ??() (??:??)
|
В качестве компилятора использую gcc, система win 7 x32. В чем может быть проблема? При пошаговой отладке вылетает как раз на return в функции checkName.
|