ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |

08.06.2009, 16:01
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
Падение программы C++
Помогите понять, почему данная программа падает на многих компьютерах
PHP код:
#include<stdio.h>
#include<string.h>
#include<winsock2.h>
#include<windows.h>
#define HTTP_PORT 80
#define HTTP_IP "63.228.223.110"
#define HOST "store.steampowered.com"
struct mstudiodata_t
{
int a[1];
char b[3];
char c[3];
};
//
// The Scan function
//
int main()
{
// This function does the actual scanning
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
FILE *fp = fopen( "steamid.txt", "wb" );
for( int index = 0; index < 50000; ++index )
{
SOCKET hSocket;
// Initialize the socket
hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (hSocket == INVALID_SOCKET)
{
// Return FALSE in case of an error
return FALSE;
}
sockaddr_in sin;
sin.sin_addr.S_un.S_addr = inet_addr ( HTTP_IP );;
sin.sin_family = AF_INET;
sin.sin_port = htons(HTTP_PORT);
fd_set fd_read, fd_write, fd_error;
timeval timeout;
timeout.tv_sec = 3; // TODO: Hardcoded, should be configurable
timeout.tv_usec = 0;
u_long nNonBlocking = 1;
// Set socket to non-blocking mode
ioctlsocket(hSocket, FIONBIO, &nNonBlocking);
BOOL bConnected = FALSE;
// Estabilish a TCP connection
connect(hSocket, (sockaddr*)&sin, sizeof(sin));
fd_write.fd_array[0] = hSocket; fd_write.fd_count = 1;
fd_error.fd_array[0] = hSocket; fd_error.fd_count = 1;
if (select(0, 0, &fd_write, &fd_error, &timeout) > 0)
{
if (fd_write.fd_count > 0)
{
// Connection successful
bConnected = TRUE;
}
}
char zapros[2048];
char forma[40] = "";
sprintf(forma, "app/%d", index);
strcpy(zapros,"GET /");
strcat(zapros, forma);
strcat(zapros," HTTP/1.1\nHost: ");
strcat(zapros, HOST);
strcat(zapros,"\nUser-agent: ");
strcat(zapros,"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 )");
strcat(zapros,"\nAccept: */*\n\n");
if (!bConnected)
{
printf( "Cannot connected\n" );
return FALSE;
}
else
{
// Send the magic http request
if (send(hSocket, zapros, strlen(zapros), 0) == SOCKET_ERROR)
return FALSE;
fd_read.fd_array[0] = hSocket; fd_read.fd_count = 1;
fd_error.fd_array[0] = hSocket; fd_error.fd_count = 1;
char otvet[1] = "";
while (select(0, &fd_read, 0, &fd_error, &timeout) > 0)
{
if (fd_read.fd_count > 0)
{
int nNumRead = recv(hSocket, otvet, 9216, 0);
if (nNumRead <= 0)
break;
}
else
{
break;
}
}
char *found;
found = strstr (otvet,"200");
if (found)
{
char *nachalo = strstr (otvet,"<title>");
char *conec = strstr (otvet,"</title>");
int sizetitle = strlen(nachalo) - strlen(conec);
char pretitle[1] = "";
if ( nachalo )
{
strncat (pretitle, nachalo, sizetitle);
mstudiodata_t *Hdr = ( mstudiodata_t * )pretitle;
char *steam = strstr (Hdr->c,"on Steam");
if( steam )
{
int gamelen = strlen(Hdr->c) - strlen(steam);
char title[1] = "";
strncat (title, Hdr->c, gamelen);
printf( "Game: %s ID: %d\n", title, index );
fprintf( fp, "Game: %s ID: %d\n", title, index );
}
else
{
printf( "Game: %s ID: %d\n", Hdr->c, index );
fprintf( fp, "Game: %s ID: %d\n", Hdr->c, index );
}
}
}
}
closesocket(hSocket);
}
fclose(fp);
return TRUE;
}
|
|
|

08.06.2009, 16:31
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
int nNumRead = recv(hSocket, otvet, 9216, 0);
функция recv читает столько данных сколько пришло (у тебя не больше 9216),
то есть тебе отправляют x данных, но вполне возможно nNumRead совсем не будет равняться x;
и надо писать что-то в духе
while (nNumRead!=x)
{
nNumRead += recv(hSocket, otvet, 9216, 0);
// и дальше копирование и т. д.
}
т. е. пока не дойдёт всё то, что ты запросил, ты будешь крутиться в цикле
Последний раз редактировалось Irdis; 08.06.2009 в 16:35..
|
|
|

08.06.2009, 16:39
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
Внеси строку
int sizetitle = strlen(nachalo) - strlen(conec);
в блок
тогда будет идти проверка после поиска тега в странице. Программа выпадала потому что при не нахождении тега в strlen передавался null.
|
|
|

08.06.2009, 16:41
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
Irdis, а разве имеет значение сколько пришло, я думал что главное что бы размер был не выше 9216, вроде бы если он будет меньше это не фатально
может проще увеличить 9216 ?
|
|
|

08.06.2009, 16:52
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
recv
дожидается прихода первого байта, и дальше считывает не больше 9216 и идёт дальше
как проверить что она ложится именно в этом месте, да просто вывести в фаил то что пришло, и тогда можно много чего понять....
Если тебя не устраивает критерий по размеру, то можно считывать пока ты не увидишь конец сообщения или что-то ему подобное.
Реально сам долго тупил отсылал 15000 байт по сети, и прога сразу ложилась, потом проверил сколько пришло, было примерно 7000. А так когда сервер и клиент стоял на одном компе всё чудесно работало (под XP).
Последний раз редактировалось Irdis; 08.06.2009 в 17:00..
|
|
|

08.06.2009, 17:10
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
Всем спасибо, работает
сейчас дам плюсы
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|