Просмотр полной версии : [c/c++] Новичкам: задаем вопросы
Страницы :
[
1]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
В этой специальной теме новички могут задавать "элементарные" вопросы по синтаксису и прочим начинаниям в языке.
Как заставить программу читая файл скрадывакать каждую строку в определенную переменную? (1 строка = 1 переменная)
Как заставить программу читая файл скрадывакать каждую строку в определенную переменную? (1 строка = 1 переменная)
fgets() читает строчку из файла, если используется RTL у тебя
27.05.2007 18:14:51, KEZ
KEZ:
#include <stdio.h>
int main(int argc, char* argv[])
{
char buf[256];
FILE *f = fopen( "C:\\1.txt", "r" );
while (fgets( buf, 255, f ))
strncpy( string, buf, 255 );
fclose( f );
return 0;
}
где string - очередная переменная в которую положится очередная строка
27.05.2007 18:15:00, KEZ
запости *** я забанен(
ultimatum
27.05.2007, 18:31
Как программно с помощью с++ обращаться по протоколу http. Как к простым файлам?
пример:
FILE *f = fopen( "http://sait.com", "r" );
может вопрос мой некоректен , но я думаю поймут )))
Как программно с помощью с++ обращаться по протоколу http. Как к простым файлам?
пример:
FILE *f = fopen( "http://sait.com", "r" );
может вопрос мой некоректен , но я думаю поймут )))
нет, либо UrlDownloadToFile, либо открыть сокет вручную
от кеза:
27.05.2007 18:43:17, KEZ
#include <stdio.h>
#include <winsock2.h> // хедер с описанием wsa ф-ий
// для ms vc++6.0 и др - подключаем lib'у с импортами wsa ф-ий
#pragma comment( lib, "wsock32.lib" )
int main(int argc, char* argv[])
{
char request[1024*5]; // буффер под запрос
char response[1024]; // буффер под ответ
sockaddr_in s_a;
WSADATA wd; // структура WSADATA
WSAStartup( MAKEWORD( 2, 2 ), &wd ); // инициализируем wsa
SOCKET s = socket( AF_INET, SOCK_STREAM, 0 ); // создаем сокет
if (s == INVALID_SOCKET) return 255; // если ошибка - выход
s_a.sin_addr.s_addr = inet_addr( "89.108.80.80" ); // айпи сервера, в данном случае - античат.ру
s_a.sin_port = htons( 80 ); // порт сервера
s_a.sin_family = AF_INET;
if (connect( s, (struct sockaddr*)&s_a, sizeof( s_a ) ) == SOCKET_ERROR) return 255; // SOCKET_ERROR - невозможно подключится к сереверу
char url[] = "/"; // страница
char host[] = "antichat.ru"; // хост
// формируем запрос
sprintf( request, "GET %s HTTP/1.1\r\nHost: %s\r\nConnection: Close\r\n\r\n", url, host );
send( s, request, strlen( request ), 0 ); // послать запрос
recv( s, response, 1023, 0 ); // максимум получить 1023 байта
printf( "%s\r\n", response ); // вывести ответ на экран
closesocket( s ); // закрываем сокет
WSACleanup(); // деинициализируем wsa
return 0;
}
27.05.2007 18:45:56, KEZ
отпиши от меня кроме кода вот что
27.05.2007 18:46:28, KEZ
"далее обрезай шапку ответа сервера (HTTP/1.1 200 OK и т.п.), все оставшееся - будет то, что вернул сервер по запрошеному адресу, например /1.txt. Другие варианты с winapi - InternetReadFile(), UrlDownloadToFile() см.
msdn..."
27.05.2007 18:45:09, KEZ
"альт. вариант - InternetReadFile()"
27.05.2007 18:45:12, KEZ
отпиши
ultimatum
27.05.2007, 19:00
спасибо KEZ и _Great_ ))) дальше я сам поисом
27.05.2007 18:14:51, KEZ
KEZ:
#include <stdio.h>
int main(int argc, char* argv[])
{
char buf[256];
FILE *f = fopen( "C:\\1.txt", "r" );
while (fgets( buf, 255, f ))
strncpy( string, buf, 255 );
fclose( f );
return 0;
}
где string - очередная переменная в которую положится очередная строка
27.05.2007 18:15:00, KEZ
запости *** я забанен(
Короче, смысл проги в том, что... а, ладно щас исходник кину:
#include <stdio.h>
#include <stdafx.h>
#include <iostream>
#include <string.h>
using namespace std;
class massive_s
{
public:
massive_s (char*, int, float);
void show_data (void);
/* void fetch (int); */
private:
char name[64];
int marck;
float m_marck;
};
massive_s::massive_s (char *name, int marck, float m_marck)
{
strcpy (massive_s::name,name);
massive_s::marck = marck;
massive_s::m_marck = m_marck;
if (m_marck > 3.5)
strcat (massive_s::name," IIEPEBEDEH");
else
strcat (massive_s::name," HE IIEPEBEDEH");
}
void massive_s::show_data (void)
{
cout <<" Name: "<< name << endl;
cout <<" Ocenka: "<< marck << endl;
cout <<" Cpednjaja ocenka: " << m_marck << endl;
}
int main (void)
{
/* здесь нужен код, который считывал бы из вайла построчно переменные, и формировал запрос в конструктор типа:
massive_s w1(string1, int1, float1); где стринг, интеджер и флоат - вытащенные из файла переменные (стринг - первая строка, интеджер - 2 и флоат - 3, причем в файле продобных строк 100 (т.е. они чередуюццо:
Вася Пупкин
1
3.3
Миша Ипачевский-Распиндосов
4
4.5
Саша шнуровской
5
3.5
)
*/
}
Вопрос: idHTTPServer ... сохранение удаленного файла на винте(через браузер)...
TFileStream *fs=new TFileStream(MyFile,fmOpenRead);
try
{
ResponseInfo->ResponseNo=200;
ResponseInfo->ContentLength= fs->Size;
ResponseInfo->ContentStream=fs;
ResponseInfo->Headers->Add("Content-Disposition: attachment; filename=MyFile.exe\r\n");
...
Сохраняет файл , но в начале файла записывает инфо с запроса (Server: Indy, Content-Length и др) , что в свою очредь убивает его работоспособность...
как сделать ,чтоб файл нормально записался???
у меня немного по сложнее трабл , я отсылаю файл по запросу, а не принимаю ...
Принимает же обычный браузер...
считываю же файл для отправки сразу потоком:
TFileStream *fs=new TFileStream(MyFile,fmOpenRead);
ResponseInfo->ContentStream=fs; //где ResponseInfo - ответ на запрос...
забавно, но если убрать строчку :
ResponseInfo->Headers->Add("Content-Disposition: attachment; filename=MyFile.exe\r\n");
, то файл сохранится правильно, но под кривым именем и без расширения...
... и опять я сам во всем разобрался ,
строка ResponseInfo->Headers->Add("Content-Disposition: attachment; filename=MyFile.exe\r\n"); при добавке первого нового хедера сама формирует остальные , причем вырезать их никак...
Выход нашел в такой же степени дурацкий, в какой и гениальной:
в к Content-type прибавляем свою строку с пробелами...(тоесть не используем метод Headers->Add)
ResponseInfo->ContentType=IdHTTPServer1->MIMETable->GetFileMIMEType(MyFile) + "\r\nContent-Disposition: attachment; filename=" + MyFile;
при этом никаких символов новых строк в конце, иначе они запишутся в отсылаемый файл...
...блин , пол вечера убил на это...
sys32, Tools -> Options -> Directories, выбери Executable Files, cl.exe должен находиться в одной из директорий, если нет, то укажи её.
Вот такой вот вопросик возник:
Нужно динамически выделить память. Но, без всяких malloc, calloc , new и т.д. Вот.
Joker-jar
19.06.2007, 14:32
Смотри:
#include "vcl.h"
#include "stdio.h"
DynamicArray <int> massiv; //Динамический массив
int main()
{
massiv.set_length(10); //Устанавливаем размер массива
for (int i = 0; i < massiv.Length; i++)
{
massiv[i] = i;
printf("%d ",massiv[i]);
}
getchar();
}
Нужно динамически выделить память. Но, без всяких malloc, calloc , new и т.д. Вот.
А как тогда?
Joker-jar, лол, а если VCL нету?
Если я не ошибаюсь, есть Api функция.
Joker-jar
19.06.2007, 15:30
Я показал, как сделать это максимально абстрактно... Если и это не то, то хз.
Но, без всяких malloc, calloc , new и т.д
Действительно, а как тогда? Это основные методы, чем они так не устраивают? Если возникают сложности, переходи на Делфи, там с этим на порядок легче (SetLength и попер)
А как тогда?
Joker-jar, лол, а если VCL нету?
наверно он не знает, что в с++ есть стандартные контейнеры, поэтому и предлагает всякое платформа-зависимое дерьмо. :(
sni4ok, возможно =) ну это не дерьмо, когда нужно писать системные проги, просто оно нужно для другого.
зы. только это не часть С++, это stl. большая разница
Joker-jar
19.06.2007, 15:58
Какие проблемы? Можно писать с vcl, можно без (третьего не дано, из теории вероятности А + не А = 1). Если проект использует vcl, почему бы не воспользоваться достаточно удобным способом создания динамических массивов любого типа данных (нужно, кстати, подключить sysdyn.h)? Если прога консольно, то ясен пень подключать vcl.h смысла нет. Написал для примера
Stl в любой нормальный компилер входит.
А ты уверен что твой Vcl скомпилится в любом компилере просто так? Его еще сливать отдельно надо.
Я тоже могу написать супер-пупер библиотеку. А смысл? В Stl есть все, что нужно. Ну, или почти всё.
зы. только это не часть С++, это stl. большая разница Только это не часть собаки, а ее ухо. Это большая разница.
С каких пор STL перестал быть частью C++?
Если проект использует vcl, почему бы не воспользоваться достаточно удобным способом создания динамических массивов любого типа данных Если удобнее юзать STL -юзай его. Если VCL - то VCL. Ты уверен, что тебе удобнее именно VCL?
с каким пор вещь, сделанная на инструменте, является частью инструмента?
хотя отчасти это и часть С++... вообщем тавтология какаято )
с каким пор вещь, сделанная на инструменте, является частью инструмента? Т.е. если я сырцы компилера скомпилю этим же компилером, то он перестанет быть компилером? )) Это типа пример.
А Stl — часть C++
Great: Часть, не часть - спорить бесполезно =) Ладно, заканчиваем оффтоп :)
wtf системные переменные дайте почитать!
с каким пор вещь, сделанная на инструменте, является частью инструмента?
язык это то, что описано в стандарте, а в стандарте stl описан, поэтому я солидарен с nerezus'ом.
ну а инструментом уже можно считать отдлельные реализации c++, такие как microsoft, borland, gcc и пр.
при этом чтобы инструмент имел в названии слово "с++" обязан поддерживать stl.
что такое препроцессор и метапрограммирование?
в какой переменной лежит длинна строки(класс string)?
как построчно читать файл в вектор до конца файла(библиотека fstream)?
как работать с tcp/ip в с++?
как работать с tcp/ip в с++? Никак. Только с помощью средств ОС либо либ или фреймворков.
в какой переменной лежит длинна строки(класс string)? Например _M_length типа size_type структуры _Rep_base класса basic_string. Это зависит от реализации. И вообще тупой вопрос. Юзай метод length().
что такое препроцессор и метапрограммирование?
Это откровенный словарный ворпос. go 2 wiki
как работать с tcp/ip в с++?
Тебе стоит прочитать про сокеты
В двух словах:
socket создает сокет, connect соединяется с хостом, send/recv отправляет/получает данные.
Это откровенный словарный ворпос. go 2 wiki
в вики есть слово триграф которого нет в вики.что это?
ну юзай тогда API функцию - VirtualAlloc
Тема разделена. Триграфы в C/C++ (https://forum.antichat.ru/showthread.php?t=42659)
Joker-jar
20.06.2007, 18:38
Как в Turbo C определить ширину экрана, но не в точках, а в символах. Грубо говоря, как узнать максимальную длину строки, которая может поместиться на экране без переноса.
Получить параметры видеорежима через прерывание Bios'а номер 10 (если под досом)
Разобрался с malloc`ом.
http://www.codenet.ru/progr/visualc/esmall/add.txt
Мож кому пригодится.
более-менее выучил с++ какой api учить?
Как в Turbo C определить ширину экрана, но не в точках, а в символах. Грубо говоря, как узнать максимальную длину строки, которая может поместиться на экране без переноса.
Ассемблерной вставкой можно узнать текущий видеорежим:
mov AH, 0Fh
int 10h
Тогда в AL будет номер режима. Но нафик это тебе? Текстовых режима по размерам всего два: 25*40 и 25*80. Поэтому в любом случае количество символов на одной строке - 25 (обычно, если ты конечно не будешь извращаться с текстом в графическом режиме - тут уже только прямым посчетом).
2scrat программируешь под win32 - winapi32, под юникс-системы posix, systemv и т.п. но первого я думаю хватит...
более-менее выучил с++ какой api учить?
Не ясен вопрос.
2scrat программируешь под win32 - winapi32, под юникс-системы posix, systemv и т.п. но первого я думаю хватит...
posix=сишник.мне хочеться выучить чисто плюсовый апи.но всё-же курс позикса на интуите почту
>>чисто плюсовый апи
что ты понимаешь под апи? я так понял, что тебе нужен набор системных подпрограмм стандарта какого-то, но если говорить совсем уж грубо функция-подпрограмма всего лишь адрес и причем здесь язык c, c++ и тем более чистый c++ я не знаю.
GoreMaster
24.06.2007, 18:19
>>чисто плюсовый апи
Stl учи
Хотя я хз че-такое "чисто плюсоый апи" :confused:
posix=сишник
Яблоки=коровы.
>>чисто плюсовый апи
Stl учи
STL это не апи.
мне хочеться выучить чисто плюсовый апи.
API "плюсовым" в винде не бывает (ну если не считать премудростей Component Object Model), в никсах тоже.
API - он один для каждой системы, тебе стоит посмотреть в словаре определение, что есть API (Application Programming Interface)
Joker-jar
01.07.2007, 06:29
Как в Turbo C определить ширину экрана, но не в точках, а в символах. Грубо говоря, как узнать максимальную длину строки, которая может поместиться на экране без переноса.
Получить параметры видеорежима через прерывание Bios'а номер 10 (если под досом)
Регистры надо чем-то заполнять? И в каком будет содержаться результат?
Регистры надо чем-то заполнять? И в каком будет содержаться результат?
Я тебе ответил на этот вопрос. Сообщение номер 39.
Создаю объект Tree View:
HWND hwndTreeView;
InitCommonControls();
hwndTreeView = CreateWindowEx(0,
WC_TREEVIEW,
"Tree View",
WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES,
0,
0,
100,
100,
hwnd,
(HMENU)ID_TREEVIEW,
hThisInstance,
NULL);
Компилятор ругаеться:
.objs\main.o:main.cpp:(.text+0x11a): undefined reference to `InitCommonControls@0'
collect2: ld returned 1 exit status
Пример создания брал отсюда: _http://msdn2.microsoft.com/en-us/library/ms650020.aspx
big_BRAT
06.07.2007, 00:16
Возможно вопрос не по адрессу, но всё же. Имеется cgi скрипт написан на С, скрипт принимает разные параметры через get (скрипт работает на apache 1.33 freebsd 6.2 /может играет роль/)
так вот у меня вопрос, возможно или переполнить бувер в таком скпирте, ведь как я понимаю то это таже откомпилированная "программа", и как я успел прочитать "Скрипт на языке C ничем не отличается от обычной C-программы. Собственно, это набор процедур, среди которых есть главная процедура. Этой главной процедуре передается управление при загрузке программы в оперативную память.", на основании сего я и сделал свой вывод. Если ответ положительный то возможно датите ссылки где про это можно почитать, зарание спасибо))
так вот у меня вопрос, возможно или переполнить бувер в таком скпирте
может ты исходник скрипта для начала приведёшь?
big_BRAT
06.07.2007, 14:15
кому интересно посмотреть выложил файл /по поводу cgi on c/
http://files-upload.com/352662/file.tar.gz.html
wasm.ru там полно про разного рода пернполнения буфера
Alexsize
13.07.2007, 10:10
Вопрос по Visual Studio 2005. Консольное приложение.
Приведу простейший пример с ошибкой, устранить которую я не могу:
#include "stdafx.h"
#include "stdio.h"
main()
{
printf("Hello World!\n");
}
Сама ошибка :
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Встречаеться мне постоянно. Как бороться я не пойму. В других IDE все работало нормально. Раньше юзал Borland. Там такого не было...
Может так? ;)
#include <stdio.h>
int main()
{
printf("Hello World!\n");
}
Alexsize
13.07.2007, 12:02
Все. Спасибо!
вообще, так
#include <stdio.h>
int main( int argc, char *argv[] )
{
printf("Hello World!\n");
}
ну если уж по всем правилам, то так:
#include <stdio.h>
int main( int argc, char *argv[] )
{
printf("Hello World!\n");
return 0;
}
Потому что в c int по умолчанию, а c++ нет =\
PS
#include <cstdio>
#include <string.h>
#include <cstdlib>
#define S "Hello, World\n"
int main(){exit(printf(S) == strlen(S) ? 0 : 1);}
:)
вообще, так
а если он не хочет передавать аргументы из командной строки?
И что? Это не значит что есть смысл определять как просто main()
Вообще, эти правила очень неконкретные и смазаные - можно использовать любую ф-ию как точку входа...
Потому что в c int по умолчанию хуюшки =)
ISO 9899 6.7.2 "At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each struct declaration and type name."
http://img248.imageshack.us/img248/7327/cppwf9.jpg и всё такое)
Где можно взять русский хелп и список операторов, функций для Turbo C++ Explorer Edition 2006?
Где можно взять русский хелп и список операторов, функций для Turbo C++ Explorer Edition 2006?
нигде.
tbody Русским врядли, а так лучше возьми C++ от MS и справкой по функциям пользуйся на msdn.com :)
Да во встроенной справке черт ногу сломит, я там искал функци записи-чтения файлов, так нихрена и не понял. Фишка в том, что там собрано куча всякой херни и все это свалено вместе и понять что откуда просто невозможно.
Книжек, примеров, документаций море в нете...
ну не суть значит понять что же делать (
как вариант, перестать читать хэкерские стотьи, авторы которых сами ничего не знают зачастую и прочитать нормальную книжку по си++, например Джесс Либерти
to ->> tclover неа не то )) по книжкам учат тока одни боты )) можна учить, читать зубрить )) но все это не то, надо просто понимать суть процесса некоторые авторы (еденицы) могут осуществлять тот или иной механизм. Я не говорю что в книгах ничего нету я про то что многое зависит от самого себя )Книжки это тока наводка (указатель) на этот процесс )
--> invlose а это тебе ведней. Я говорил что тока некоторые кижки нормальные если были нормально написаные то вопросов бы не было. А на счет ботов я говорю просто по себе 3наю но бывают исключение (редко) извини могу ошыбатся )
2 f04c3 убейся нахер
хотя нет если ты телепат и можешь пронкать в мысли других людей то ты спаситель человечества и последняя наша надежда а нам простым смертным приходится узнавать про новые технологии и архитектуры ос постаринке из статей и книжек
--> da_ff ты так не нервничай )
простите за глупый вопрос, но у меня не получается компилировать, не объясните?
простите за глупый вопрос, но у меня не получается компилировать, не объясните?
потяни за рычажок. напиши сначала подробнее что за компилятор и тд.
простите за глупый вопрос, но у меня не получается компилировать, не объясните?
http://www.delorie.com/djgpp/compile/
сконпелируй онлайн.
Bcc55 мой компилятор, попробовал через командную строку и получилось вот это
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
sample.cpp:
Error E2209 sample.cpp 1: Unable to open include file 'iostream'
Error E2282 sample.cpp 2: Namespace name expected
Error E2451 sample.cpp 6: Undefined symbol 'cout' in function main()
*** 3 errors in Compile ***
А исходный код такой
#include <iostream>
using namespace std;
int main ()
{
cout << "C++-программирование - это сила!";
return 0;
} Я не понимаю почему он не находит "iostream" хотя он есть в папке include
напиши #include <iostream.h>
и убери вторую строчку про нэйспейс.
и скачай потом конпелятор поновее [привет nerezus]
Ладно компилятор поищу, видно мой совсем тупой, что даже не понимает простейших команд
да нет же =\
Просто стандарты стали новыми, а компилятор остался старым.
если убрать обьявление области имен то компилятор будет ругаться на cin и cout и еще либо тиши на латинице слова либо используй CharToOem
char c[100];
CharToOem("C++-программирование - это сила!",c);
Скачал компилятор DEv-C++ он тоже мозг е**т никакой код не компилирует совсем не знаю прям что и делать новый искать или в нем надо еще что-то настраивать?
Скачал компилятор DEv-C++
Это среда разработки, а компилятор там MinGW. Ппц, нормальными компилями не пробовал пользоваться?
никакой код не компилирует совсем
Пример кода + ошибки в студию.
Вот код
#include <iostream.h>
int main()
{
cout << "C++-программирование - это сила!";
return 0;
}
#include <iostream.h> -> #include <iostream>
using namespace std;
пользовался Borland 5.5, но он старый говорят, посоветовали поменять
#include <iostream.h> > #include <iostream.h>
using namespace std;
2 строку мне посоветовали вычеркнуть
Сори, я копипаст сделал забыл поправить =))
#include <iostream>
напиши конечный вариант, на котором ты остановился :)
например, если компилятор старый, то пиши
#include <iostream.h>
если новый, то
#include <iostream>
using namespace std;
а потом скачай Джесс Либерти "С++ за 21 день", издание поновее поищи только, и уже по ней учись.
напиши конечный вариант, на котором ты остановился :)
например, если компилятор старый, то пиши
#include <iostream.h>
если новый, то
#include <iostream>
using namespace std;
а потом скачай Джесс Либерти "С++ за 21 день", издание поновее поищи только, и уже по ней учись. Все равно ошибку пишет и ему почему-то Cout не нравится
C:\Borland\BCC55\Bin>Bcc32 sample.cpp
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
sample.cpp:
Error E2209 sample.cpp 1: Unable to open include file 'iostream.h'
Error E2451 sample.cpp 5: Undefined symbol 'cout' in function main()
*** 2 errors in Compile ***
C:\Borland\BCC55\Bin>Bcc32 sample.cpp
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
sample.cpp:
Error E2209 sample.cpp 1: Unable to open include file 'iostream'
Error E2451 sample.cpp 5: Undefined symbol 'cout' in function main()
*** 2 errors in Compile ***
Error E2209 sample.cpp 1: Unable to open include file 'iostream'
Ну он библеотеку не может подключить, а функция cout находитьcя в iostream.h
Если попробовать не
#include <iostream.h> а
#include "iostream.h"
у тебя наверное не настроено окружение компилятора (путь к хидерам всмысле)
зайди в настройки компилятора и проверь.
Можешь ещё посмотреть в консоли echo %include%
cout - не функция
> cout is an object of class ostream that represents the standard output stream
#include "iostream.h"
это инклуд из каталога, в котором сорец. там точно нет iostream.h
^^ с чего это инклюд из католога где сорец?=\ теперь сорци со стандартыми библиотеками отдельно идут? ИМХО просто пути до библиотек не прописаны вот и все
tclover прав, возьми учебник почитай
<iostream.h> и "iostream.h" разные вещи, в первом случае хидер ищется в стандартном каталоге с хидерами, во втором в папке с исходником.
это инклуд из каталога, в котором сорец. там точно нет iostream.h Если не находит локально - то будет искать в стандартных.
И еще: стандартный — это iostream, а не iostream.h (котоорый оставлен в целях обратной совместимости, его может и не быть)
Нер, как думаешь, откуда в древнем компиляторе взяться новым стандартам? :)
> Если не находит локально - то будет искать в стандартных.
ок. и это типа поможет если #include <iostream.h> не помогает?)
У меня вопрос вообщем =\
Что значит extern "C"? То есть даже не совсем "что значит", так как я понимаю приблизительно это, а вот в каких случаях это применять?
Например вот кусочек из программы: extern "C" HWND WINAPI GetConsoleWindow();
То есть таким образом, я указываю компилятору что данная ф-ция откуда-то экспортируется? (откуда?)
И вот я не понимаю ещё, как мне узнать в каком случае нужно писать extern "C", а в каком нет?
У меня вопрос вообщем =\
Что значит extern "C"? То есть даже не совсем "что значит", так как я понимаю приблизительно это, а вот в каких случаях это применять?
Например вот кусочек из программы: extern "C" HWND WINAPI GetConsoleWindow();
То есть таким образом, я указываю компилятору что данная ф-ция откуда-то экспортируется? (откуда?)
И вот я не понимаю ещё, как мне узнать в каком случае нужно писать extern "C", а в каком нет?
когда юзаешь чужие сишные либы(типа lua) - то инклюдь их внутрь этого блока.
extern "C" говорит компилятору, что функцию нужно манглить по правилам Си, а не по правилам С++. Может использоваться и для импорта, и для экспорта.
При компоновке программы с подключением модулей скомпилированных с-компилятором надо дабавлять extern "C", поскольку с++-компилятор, используя имя функции данное человеком, генерирует своё уникальное имя. Линковщик компонуя объектные файлы (библиотеки, dll-ки ...), полученные разными компиляторами просто не обнаружит необходимой функции. Такая ситуация может возникнуть при использовании сторонних библиотек, dll, объектных файлов. А какже при использовании в своем проекте файлов с разными расширениями *.c или *.cpp, поскольку компилятор обращает внимание на раширение файла.
sys64, использовать функции WinApi, документации хватает.
qwerty qwerty qwerty
проверка =)
переполз с дельфи на си...
в качестве первого проекта выбрал "remot acces system" =)
интересно ваше мнение, что можно зделать лучше? как будет быстрее? как будет грамотней с точки зрения си программиста? и пожалуйста почему?(обязательно)
+ предложившему что-то дельное.
//main module
#include "NetFunc.h"
#include <windows.h>
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text, EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:WinMain")
int StartSession(SOCKET,SOCKADDR_IN);
void ErrorFunc(int Fr)
{
MessageBox(0,"1111","1111",1);
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
char chA=0;
int iReset=0;
int iOff=0;
while(!iOff)//Main loop
{
WSADATA sWsaData;
SOCKET hLSock;
long host=INADDR_ANY;
short port=6677;
if(WSAStartup(MAKEWORD(2,0),&sWsaData)!=SOCKET_ERROR)
{
hLSock = socket(AF_INET,SOCK_STREAM,0);
if(hLSock!=INVALID_SOCKET)
{
SOCKADDR_IN addr_Sock;
addr_Sock.sin_family = AF_INET;
addr_Sock.sin_addr.s_addr = htonl(INADDR_ANY);
addr_Sock.sin_port = htons(port);
if(bind(hLSock,(LPSOCKADDR)&addr_Sock,sizeof(addr_Sock))!=SOCKET_ERROR)
{
if (listen(hLSock,1)!=SOCKET_ERROR)
{
while(!iReset)//Accept loop
{
int size=sizeof(addr_Sock);
SOCKET hWSock= accept(hLSock,(LPSOCKADDR)&addr_Sock,&size);
if(hWSock!=INVALID_SOCKET)
{
int i=StartSession(hWSock,addr_Sock);
if(!i)iReset=1;
if(i<0) iOff=1;
}
else//accept
{
ErrorFunc(5);
}
shutdown(hWSock,0);
closesocket(hWSock);
}//Accept loop
}
else//listen
{
ErrorFunc(4);
}
}
else//bind
{
ErrorFunc(3);
}
shutdown(hLSock,1);
closesocket(hLSock);
}
else//Creat listen sock
{
ErrorFunc(2);
}
WSACleanup();
}
else//WSAStartup
{
ErrorFunc(1);
}
Sleep(2000);
}//Main loop
return 0;
}
//NetFunc.cpp
#include <winsock2.h>
#define SOCK_TOUT 5000000;
/////////////////////////////////////////////Send data
int SendData(SOCKET hSock, char *pBuffer, int len)
{
/////Encrypt
/////
int ts=0;
int ss=0;
timeval SendTimeout;
fd_set fds;
FD_ZERO(&fds);
FD_SET(hSock, &fds);
SendTimeout.tv_sec=0;
SendTimeout.tv_usec=SOCK_TOUT;
while(len > 0)
{
ts = select(0, NULL, &fds, NULL, &SendTimeout);
if(!ts) return -1;//time out
if(ts < 0) return -2;//sel error
ss = send(hSock, pBuffer, len, 0);
if(ss < 0)
return -3;//send error
else
{
len -= ss;
pBuffer += ss;
}
}
return 0;//ok
}
////////////////////////////////////////////Recv data
int RecvData(SOCKET hSock, char *pBuffer, int len)
{
int ts=0;
int rs=0;
timeval ReceiveTimeout;
fd_set fds;
FD_ZERO(&fds);
FD_SET(hSock, &fds);
ReceiveTimeout.tv_sec = 0;
ReceiveTimeout.tv_usec = SOCK_TOUT;
while(len > 0)
{
ts = select(0, &fds, NULL, NULL, &ReceiveTimeout);
if(!ts) return -1;//time out
if(ts<0) return -2;//sel error
rs = recv(hSock, pBuffer, len, 0);
if(rs < 0)
{
return -3;//recv error
}
else
{
len -= rs;
pBuffer += rs;
}
}
/////Decrypt
/////
return 0;//ok
}
////////////////////////////////////////////
//executer.cpp
#include "NetFunc.h"
#include <windows.h>
int StartSession(SOCKET hSock,SOCKADDR_IN addr_Sock)
{
char Buff[4];
char szCom[3];
char szSubCom[3];
//ident
//logon
//exec. comands
while(1)
{
if (recv(hSock,&Buff[0],sizeof(Buff[0]),MSG_PEEK)<=0) return WSAGetLastError();
if (RecvData(hSock,&Buff[0],sizeof(Buff))!=0) return WSAGetLastError();
//analyze comand
for(int i=0;sizeof(Buff)-1;i++)
{
if(i<2)szCom[i]=Buff[i];
else szSubCom[i-2]=Buff[i];
}
szCom[3]=0;
szSubCom[3]=0;
switch(atoi(szCom))
{
case 0:break;
case 1:break;
case 2:break;
default: return 1;
}
//analyze comand
if (SendData(hSock,&Buff[0],sizeof(Buff))!=0) return WSAGetLastError();
}
return 0;
}
сорри за флуд... какой тег исп. для оформления кода?
сорри за флуд... какой тег исп. для оформления кода?
... вместо 0 = O
2 x-lord ИМХО стараюсь избегать высокой вложенности кода
к примеру вместо
если (функция=выпонилась_правил но) то {большой_набор_операторов}
предпочитаю
если (финкция=выполнилась_не_пра вильно) то выход
{большой_набор_операторов}
еще
while(len > 0)
{
ts = select(0, &fds, NULL, NULL, &ReceiveTimeout);
if(!ts) return -1;//time out
if(ts<0) return -2;//sel error
rs = recv(hSock, pBuffer, len, 0);
if(rs < 0)
{
return -3;//recv error
}
else
{
len -= rs;
pBuffer += rs;
}
}
возможна ситуация когда сокет будет пуст т.е. все данные которые на него пришли прочитаны, но bufer еще не заполнен тогда если на том конце не запретили передачу данных на сокет то recv остановит выполнение функции т.к. будет ждать данных которые не придут.
тут надо ввести договоренность что все передаваемые сообщения будут заканчиваться какой то комбинацией и тебе надо считывать пока она не придет
там таймаут какраз для устранения такой комбинации и связанных с ней переполнений...
если пришло меньше лен то можно сушить ласты...
диалоговый режим.
2 X-lord
ты всегда будешь знать сколько бай прочитать? сомневаюсь
это будет работать хорошо только локально, в условиях wan будут проблемы, возможны задержки проблемы с сетью возможно за тайм-аут все данные не успеют придти
в любом случае код очень не универсален и в другой ситуации работать будет не стабильно
кстати я щас тоже сетевым кодингом увлекся стучи в асю будем обмениваться опытом =)
всмотрись в код получьше...
приняли неполностью - ждём...
неприняли часть вообще - выходим по таймауту...
по задумке в разных частях программы будут разные размеры буферов
функции реализованны синхронно
допустим клиент передаёт команду в 4 байта
2 байта читаются как выбор функции 2 - спускаются на уровень ниже
и читаются как выбор операции(пока нереализованно)допустим функция - файловый менеджер, команда - код операции.
сервер переходит в режим сессии с файл. менеджером
клиент переходит в режим приёма ответа в 2048б
сервер передаёт список дисков, если всё невлезло то приписывает упр. команду кот. это показывает...
клиент это всё принимает(если есть команда "есть ещё" то принимает опять....)
и посылает следующую команду... смысл ясен?
цель-защита от переполнений+устойчивость к сбоям
проще непридумал...
такой способ больше подходит Udp
всё... спать пошёл
смысл ясен?
=) в том то и дело что не ясно
в том примере откуда взяты эти функции, они написаны с учетом что первые 2 байта сообщения будут содержать длину пришедшего сообщения, потом в куче выделяется место под запрос и читается челиком, ты же на все забил и сделал голую статику причем интересное место =)
if (recv(hSock,&Buff[0],sizeof(Buff[0]),MSG_PEEK)<=0) return WSAGetLastError();
ты читаешь 4 байта
if (RecvData(hSock,&Buff[0],sizeof(Buff))!=0) return WSAGetLastError();
а потом снова пытаешься прочитать 4 байта только уже другой фунуцией
if (recv(hSock,&Buff[0],sizeof(Buff[0]),MSG_PEEK)<=0) return WSAGetLastError();
тормозим до момента приёма команды... с MSG_PEEK следующая ресив прочтёт эти 1! байта....
всм. блокирующий вызов без очистки вход. буфера
if (RecvData(hSock,&Buff[0],sizeof(!!!!Buff!!!!))!=0) return WSAGetLastError();
а потом снова пытаешься прочитать 4 байта только уже другой фунуцией
весь буфер
ЗАТУПИЛ=)
забыл размерность Char =)
ты же на все забил и сделал голую статику
мне показалось - оптимальный вариант
а по хорошему ты прав... надо клиент делать на основе неблокирующих сокетов и
передавать (размер\ком\сабком\датален\ ата)
но пока пусть будет так
оцени код по 10-и бальной шкале криворукости кодера
Хай!
1. Как лучше(и правильней) отделить заголовок от данных полученых с веб-сервера?
2. Как лучше получать данные с веб-сервера, что бы не ждать, пока по таймауту recv вернет false?
/*--------Эту херню нада заменить нах-------*/
do
if (recv(inet_Sock,Buff,4096,0)){
//MessageBox(0,Buff,"Recv",0);
}else break;
while (1);
/*------------------------------------------*/
2 aivus
1)последовательность "\r\n\r\n" ты б хоть ознакомился с протоколом прежде чем что нибудь писать
2)используй асинхронные сокеты
1)последовательность "\r\n\r\n" ты б хоть ознакомился с протоколом прежде чем что нибудь писать
2)используй асинхронные сокеты
1)Я как раз думал написать в предыдущем посте "кроме \r\n\r\n". Просто думал мож можно как-то иначе, ладно... буду юзать этот способ...
2)Да тут дело как раз не в том... Просто имхо неправильно ждать таймаута recv и только потом ломать цыкл...
Такой вопросец: что делает следущая функция cout.setf(ios::left);
в учебнике вроде как написано, что сдвигает следущую надпись влево.
Но когда я записывают код типа:
cout<<123;
cout.setf(ios::left);
cout<<456;
у меня выводится на экран: 123456
Может кто подробнее написать, что делает эта функция? (таже в учебнике написано, что по умолчанию стоит cout.setf(ios::right), типа следующая запись выводится справа)
groundhog
03.08.2007, 19:56
...в учебнике вроде как написано, что сдвигает следущую надпись влево...
Научитесь правильно читать учебники, молодой человек... Управление флагами в данном случае ничего никуда не сдвигает - оно управляет выравниванием... А чтобы убедиться, что всё работает, сделайте последовательно вызовы:
cout.setf(ios::left, ios::adjustfield);
cout.width(4);
cout << '[' << 0 << "]\n";
cout.setf(ios::right, ios::adjustfield);
cout.width(4);
cout << '[' << 1 << "]\n";
cout.setf(ios::internal, ios::adjustfield);
cout.width(4);
cout << '[' << 2 << "]\n";
MegaBits
03.08.2007, 21:34
server.obj : error LNK2019: unresolved external symbol __imp__WSASocketA@24 referenced in function "int __cdecl ping(char *,int,int)" (?ping@@YAHPADHH@Z)
Что не так??? Может какую-то библиотеку забіл подключить??*
Может какую-то библиотеку забіл подключить??
Ws2_32.lib
MegaBits
03.08.2007, 21:57
Еще вопрос как с помощью win_api функций реализовать поиск файла по жесткому с определенным расширениием и посылкой его на фтп с авторизацией.
Еще вопрос как с помощью win_api функций реализовать поиск файла по жесткому с определенным расширениием и посылкой его на фтп с авторизацией.
И чтоб бэкдор на nasa.gov биндился?
Поиск файла: читай MSDN насчет функции MatchesMask и структуры WIN32_FIND_DATA.
Фтп по тому же принципу, примеров море.
MegaBits, для поиска тебе понадобятся функции FindFirstFile() и FindNextFile() и магическая структура WIN32_FIND_DATA. Насчет фтп с авторизацией можно реализовать с помощью сокетов или с помощью готовой функции библиотеки WinInet FtpPutFile(). Подробнее в msdn: http://msdn2.microsoft.com/en-US/library/aa384170.aspx
как сделать задержку в *nix/*bsd программы.то есть
cout<<"1";
//задержка-30сек
cout<<"2";
sleep(30);
или
usleep((useconds_t)30000);
P.S. <unistd.h>
sleep(30);
или
usleep((useconds_t)30000);
P.S. <unistd.h>
пробовал sleep(1).прога спала минуту(!)потом выдала 1,2.правда я юзал c++ вариант
sleep в linux в минутах.
там значения типа long,а
sleep((long)0.10);
не прокатывает
прога:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout<<"1";
sleep(1);
cout<<"2";
return 0;
}
компил:
g++ test.cpp -o test
прога зависает на секунду(!) и после этого выдаёт 1 и 2.как это исправить?
http://manpage.stsland.ru/man3/usleep.3.html
http://manpage.stsland.ru/man3/usleep.3.html
тот же результат
прога зависает на секунду(!) и после этого выдаёт 1 и 2.как это исправить?
fflush(STDIN)
sleep((long)0.10);
не прокатывает Выучил бы основы сишника для начала!
c++ вариант °_O
nerezus: ну тык я,ж в g++ компилю,какой там unistd.h может быть?!
scrat, самый обычный.
"C++ для чайников"
scrat@scrat:/usr/include/c++/4.1.2$ ls
algorithm clocale ctime functional locale stdexcept
backward cmath cwchar i486-linux-gnu map streambuf
bits complex cwctype iomanip memory string
bitset csetjmp cxxabi.h ios new tr1
cassert csignal debug iosfwd numeric typeinfo
cctype cstdarg deque iostream ostream utility
cerrno cstddef exception istream queue valarray
cfloat cstdio exception_defines.h iterator set vector
ciso646 cstdlib ext limits sstream
climits cstring fstream list stack
ну и что?
$ ls /usr/include | grep uni
unistd.h
Подскажите плз, как разделить строку по символам?
groundhog
13.08.2007, 09:55
Сказал бы подробнее что нужно ответ был бы поразвёрнутее... А так... Могу только сказать - копай в сторону strtok...
char *strtok(char *str1, const char *str2);
Сказал бы подробнее что нужно ответ был бы поразвёрнутее... А так... Могу только сказать - копай в сторону strtok...
Поразвернутей тогда так:
Веб сервер отправляет ответ HTTP/1.1 200 OK , Content-Type: text/html и т.д., вот мне необходимо убрать этот заголовок, и оставить только данные полученные от запроса.
Юзая strtok я делаю так:
p=strtok(Buff,"\n\r\n\r");
MessageBox(0,p,"Recv",0);
Результат:
HTTP/1.1 200 OK хотя вроде после HTTP/1.1 200 OK идет только \n\r
Может так понятней будет.
char *command[128], buf[128];
char *s = strtok(buf, "|");
for(int i = 0; s; s = strtok(0, "|"), i++) command[i] = s;
function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
except
Result := False;
end;
end;
Ктото может на с++ перевести?
z01b,
bool DownloadFile(char *SourceFile, char *DestFile)
{
if(UrlDownloadToFile(NULL, SourceFile, DestFile, 0, NULL) != S_OK) //S_OK - успешно
{return false;}
else {return true;}
}
groundhog
14.08.2007, 10:02
aivus, там же идёт не \n\r\n\r, а \r\n\r\n...
Сказал бы подробнее что нужно ответ был бы поразвёрнутее... А так... Могу только сказать - копай в сторону strtok...
Насколько я понял, разделение идет любым из символов, входящих во вторую строку. Можно ли как-то сгрупировать строку, тоесть вот есть необходимо разделись но строке "blablabla" если обычно использовать strtok то разбивка будет произведена на любому из символов: "b", "l", "a"
aivus, ты можешь нормальным языком написать что тебе нужно?
Могу, я пишу бота, который обращается к веб-админке. И мне нужно получать от этой веб-админки команды(их может быть несколько). Но апач как известно посылает еще и заголовок. Вот я и пытаюсь найти наиболее удобный способ избавиться от заголовка, что бы работать с получеными данными...
Может так понятней будет.
char *command[128], buf[128]; char *s = strtok(buf, "|"); for(int i = 0; s; s = strtok(0, "|"), i++) command[i] = s;
Но использовать такой вариант не оч удобно... Так как хз сколько команд отправила веб-админка а с массивами мучаться влом...
aivus, читай, там как раз есть нужный тебе код:
http://segfault.by.ru/botmast/rat-systems.txt
HighExcel
15.08.2007, 11:11
решил постепенно перейти от Делфи к С++
но пока не могу разобраться с TextBox, char, string.
как перевести на сиплусплус приблизительно следующее
<CODE>
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
s:string;
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text)+10;
c:=a+b;
s:=IntToStr(c);
Edit3.Text:=s+' чегонибуть';
end;
</CODE>
> как перевести на сиплусплус приблизительно следующее
http://www.translate.ru
Пока ты будешь проводить аналогии, считая делфи языком, содержащим такие "конструкции" - нихера не поймешь, может только отдельные части
Joker-jar
15.08.2007, 11:22
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a,b,c;
AnsiString s;
a = StrToInt(Edit1->Text);
b = StrToInt(Edit2->Text) + 10;
c = a + b;
s = IntToStr(c);
Edit3->Text = s + " чегонибуть";
}
HighExcel
15.08.2007, 13:01
для придирчивого KEZ:
а что ты в делфях бы написал?
Edit3.Text:IntToStr(StrToInt(Edit1.Text)+StrToInt( Edit2.Text)+10)+'чего нибуть'; ?
написал для примера чтобы было понятно чего я хочу
меня интересует перевод из инт в стринг или чар
из текст бокса в инт и тд
как это правильно оформить
[53x]Shadow
15.08.2007, 13:17
Из инта в чар
errno_t _itoa_s(
int value,
char *buffer,
size_t sizeInCharacters,
int radix
);
Из чара в инт
int atoi(
const char *string
);
Вот еще вариант из чара в инт
https://forum.antichat.ru/showpost.php?p=437121&postcount=30
int int_value = 10;
sprintf( lpString, "%d", int_value );
// теперь в строке lpString записана строчка"10"
-----------------------
int int_value = atoi( "10" ); // теперь в int_value число 10
как перевести на сиплусплус приблизительно следующее
ВОпрос не имеет смысла без уточнения - MFC / VCL / WinApi ?
ВОпрос не имеет смысла без уточнения - MFC / VCL / WinApi ?
а как же linux/unix/symbian/openmoko и т.д ?
Ну забыл дописать "/и т.д."
меня интересует перевод из инт в стринг или чар
из текст бокса в инт и тд
как это правильно оформить Ты не поверишь, но везде по разному. Зависит от класса строк.
Alexsize
17.08.2007, 08:34
Как в с++ сменить рабочую группу компьютера? В реестре я не нашел параметров рабочей группы, только имя компа. И второй вопрос: можно ли это делать без перезагрузки компа?
Мой компьютер => Свойства => Имя компьютера => Изменить
Смотришь, какие файлы/ветки реестра трогает =)
System Information Functions
The following functions are used to retrieve or set system information.
http://msdn2.microsoft.com/en-us/library/ms724953.aspx
я думаю в этом что-то есть
Alexsize
17.08.2007, 13:30
Согласен, классные функции, но вот где та, что меняет имя рабочей группы?
Подскажите как в поток передать больше 1-го параметра?
token[1] - это первый параметр, а вот как передать 2-й хз...
DWORD Down;
HANDLE thDown = CreateThread(0, 0, &Download,(PVOID)&token[1],0, &Down);
groundhog
17.08.2007, 15:44
aivus, ну ты передал указатель на token, а дальше идексируй его как хочешь...
DWORD Down;
unsigned char buffer[2] = {0};
buffer[0] = 1;
buffer[1] = 2;
HANDLE thDown = CreateThread(0, 0, &Download,(PVOID)buffer,0, &Down);
В внутри Download, обращайся к переданному параметру скажем как inParam[0] или inParam[1]... Только не выскочи за пределы...
А вообще, лучше сделай структуру с полями, символизирующими твои параметры, и передавай указатель на эту структуру.
>>Подскажите как в поток передать больше 1-го параметра?
http://forum.antichat.ru/showpost.php?p=396397&postcount=27
ToniKapuchon
20.08.2007, 03:05
Помогите прочитать значение с реестра, средствами студии, закалебался уже экперементировать:
#include "windows.h"
#include <fstream.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HKEY key;
unsigned char *buf;
unsigned long sz=MAX_PATH;
ofstream book_file("BOOKINFO.txt");
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software/Microsoft/WAB/WAB4/Wab File Name", 0, KEY_QUERY_VALUE, &key)!=ERROR_SUCCESS)
{
RegQueryValueEx(key, "", NULL, NULL, buf, &sz) ;
book_file << buf;
}
return 0;
}
Alexsize
20.08.2007, 08:43
Вот тебе рабочий пример:
#include <windows.h>
int main(int argc, char* argv[])
{
HKEY hKey;
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\WAB\\WAB4\\Wab File Name",KEY_READ, KEY_QUERY_VALUE, &hKey );
DWORD dwType;
BYTE buffer[1024];
DWORD size = sizeof(buffer);
RegQueryValueEx( hKey, "", 0, &dwType, buffer, &size );
RegCloseKey(hKey);
MessageBox(NULL, LPCSTR(buffer), "Ontechad",MB_OK | MB_ICONQUESTION);
}
закалебался уже экперементировать:
Зачем экспериментировать если в Msdn все написано?
Alexsize
20.08.2007, 12:06
В Msdn я, например, не нашел как сменить рабочую группу компа. Может плохо искал?
[53x]Shadow
20.08.2007, 14:41
В Msdn я, например, не нашел как сменить рабочую группу компа. Может плохо искал?
Да пришлось конкретно порыться =\
меняем рабочую группу:
NET_API_STATUS nas;
nas = NetJoinDomain(NULL,L"Новое Имя Рабочей Группы",NULL,NULL,NULL,0);
if(nas == NERR_Success)
std::cout << "good" << std::endl;
else
std::cout << "bad" << std::endl;
Подскажите плз. Выполняется скачка файла так:
char Buff[4096]="";
while(i = recv(down_Sock, Buff+lstrlen(Buff), 1, 0))
{
if (i == SOCKET_ERROR) return 0;
} Но мелкие файлы качает без проблем, а вот большие останавливается на 79,7 кб и все... пока не выбивает по таймауту. Мож кто знает с чем звязано?
Добавлено: Вру, файлы нормально, а вот пробую загрузить index.php глюки которые видите выше...
char Buff[4096]="";
while(i = recv(down_Sock, Buff+lstrlen(Buff), 1, 0))
{
if (i == SOCKET_ERROR) return 0;
}
переполнение же явное на лицо
Как лучше тогда объявить переменную?
Ну я в шоке просто. Зато пишем троянов и тд. С++ для чайников - вот что вам нужно.
Ну я в шоке просто. Зато пишем троянов и тд. С++ для чайников - вот что вам нужно.
Взял пример вот от сюда: http://forum.antichat.ru/showpost.php?p=436900&postcount=151
Молодец, а теперь попробуй понять что этот код обозначает. Не надо пользоватся готовым кодом, если не знаешь как он работает, привыкай писать сам, а то что-то мне кажется, что в твоем трояне только пару строчек, да названия переменных с функциями твои будут.
--
Сцитировал неправильно просто.
Ну насколько я понял полученые данные загоняются в Buff а вот lstrlen высчитывает длинну строки Buff и хз чё там происходит...
Дайте кто-нибудь сирийный номер на Microsoft Visual C++ !?
C!klodoL
23.08.2007, 10:46
подкинтьте хороший, наиболее полный справочник по функциям (на русском), а то в гугле одна шляпа попадается =/
groundhog
23.08.2007, 11:02
http://msdn.microsoft.com.
Учи английский.
http://msdn.microsoft.com.
Учи английский.
http://msdn2.microsoft.com/ru-ru/default.aspx не рулит? :)
groundhog
23.08.2007, 11:50
n1†R0x, если ты заходишь с русского региона, то он тебя сюда и направит... :) Поэтому я дал более общую ссылку, с которой он будет редиректить на подходящий для региона ресурс... :)
ToniKapuchon
25.08.2007, 03:07
Хочу загрузить окно через ресурс, нарисовал окно в *.rc :
lala.cpp:
#include "stdafx.h"
#include "resource.h"
BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM IParam)
{
return true;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOGBAR),NULL, Dlg_Proc);
return 0;
}
resource.h:
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Script1.rc
//
#define IDD_DIALOGBAR 103
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
Компилирует без ошибок, но окна не видно (даже ShowWindow() писал :) ) . Подскажите кто..
Art-Cool
29.08.2007, 12:42
Хочу начать учить С++, посоветуйте пож.книгу дня начинающих (супер,мега,гипер чайников)
заранее благодарен
phol1eadeux
29.08.2007, 12:44
Хочу начать учить С++, посоветуйте пож.книгу дня начинающих (супер,мега,гипер чайников)
заранее благодарен
Советую тебе сначала начинать с C, а потом уже переходить к ООП и C++
Art-Cool Я бы посоветовал купить книжный вариант, всегда рядом когда нет компа... быстрее учится и подрукой всегда когда кодить начнешь...
Любой САМОУЧИТЕЛЬ С++ ... Я читал от автора "Крупник"...
Art-Cool
29.08.2007, 13:01
Art-Cool Я бы посоветовал купить книжный вариант, всегда рядом когда нет компа... быстрее учится и подрукой всегда когда кодить начнешь...
Любой САМОУЧИТЕЛЬ С++ ... Я читал от автора "Крупник"...
Спасибо обязательно куплю.но мну не помешалбы ещё и электронный много времени на работе за компом провожу.
Ищу функцию или хидер файл для base64 encode, есть у когонить?
z01b
http://hackstyle.narod.ru/cpp_base64.htm
оно?
z01b
http://hackstyle.narod.ru/cpp_base64.htm
оно?
А для текста, не найдётся? Лень переделавать (
z01bАга я тоже щас ищу Base64 - А лучше вообще описание алгоритма как такового... чтобы про каждый байтик :) Подскажите плз...
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789+/";
//-----------------------------------------------------------------
void Base64Encode(char *buf, char *obuf, int len){
int i;
for(i=0; i<len-2; i+=3){
*obuf++ = b64[(buf[i]>>2) & 0x3F];
*obuf++ = b64[((buf[i] & 0x3)<<4 | ((int)(buf[i+1] & 0xF0)>>4))];
*obuf++ = b64[((buf[i+1] & 0xF)<<2) | ((int)(buf[i+2] & 0xC0)>>6)];
*obuf++ = b64[buf[i+2] & 0x3F];
}
if(i<len){
*obuf++ = b64[(buf[i]>>2) & 0x3F];
if(i == (len-1)){
*obuf++ = b64[((buf[i] & 0x3)<<4)];
*obuf++ = '=';
}else{
*obuf++ = b64[((buf[i] & 0x3)<<4 | ((int)(buf[i+1] & 0xf0)>>4))];
*obuf++ = b64[((buf[i+1] & 0xf)<<2)];
}
*obuf++ = '=';
}
*obuf++ = '\0';
}
Кузьмич респектище тебе огромный\ уже как час искал, твоя функция лучшая в реализации ;)
Самое простое и понятное описание этого алгоритма http://openteam.info/index.php?page=viewart&art_id=1
Это для тех кто хочет понять как именно работает :)
Кузмичь, лови плюсег )))
Gloff тебе тоже +1, статейка просто класс!
Что означает тип переменной со звездочкой?\
Например char*
в твоем случае указатель на тип char, более подробнее можно прочитать в любой книге для новичков.
groundhog
31.08.2007, 15:32
Указатель на тип char (один байт). Т.е. идентификатор такого типа содержит не данные, а указатель на область памяти где эти данные находятся.
Указатель на тип char (один байт). Т.е. идентификатор такого типа содержит не данные, а указатель на область памяти где эти данные находятся.
а в чем различие на практике?
groundhog
31.08.2007, 15:36
а в чем различие на практике?
То есть? Вопроса не понял...
То есть? Вопроса не понял...
между типом со звездочкой и без звездочки. или без не бывает?
В первом случае в переменной хранятся данные, во-втором адрес данных.
groundhog
31.08.2007, 16:46
Piflit, звёздочка как раз и говорит о том, что данный идентификатор означает, что это не данные а указатель на реально место хранения данных. Пример:
int *pint;
int intvar = 10;
На текущий момент pint не определён (содержит в себе неопределённый указатель), т.е. переменная pint которая связана с какой-то ячейкой памяти содержит в себе мусор, а переменная intval, которая связана с какой-то ячейкой памяти содержит целое число 10.
pint = &intvar;
Теперь pint содержит в ячейки памяти адрес по которому находятся данные из intvar;
И если ты сделаешь printf("%d", *pint), то на экран выведется 10. Обрати внимание, чтобы получить значение, которое находится по указателю, нужно применить операцию разыменования (*).
А вообще читай азы по сям...
Небольшое отступление к сообщению groundhog. Всегда определяйте указатели.
int *pint = 0;
Такие мелочи приводят к ошибкам в больших проектах, читайте книги.
Всем спасибо, я разобрался.
А вообще читай азы по сям...
Я читал, но, видимо, не очень хорошо :rolleyes:
> а в чем различие на практике?
Различие принципиальное. У тебя есть переменная scratch. Ее значение - это какие-то байты по адресу определенному. Когда ты к ней обращаешься
char scratch = getColor( 0 );
компиллер генерирует такой код, например:
push 0
call getColor // вызов getColor
mov byte ptr [0x00401020], eax // положить результат в байт по адресу, тут ее адрес 00401020
А предположим она у тебя char *scratch.
Тогда она в 32-битной системе (проца) будет 4-байтным значением (DWORD, ULONG и тп), в ней будет хранится АДРЕС чего-то. Т.е. в принципе по*** пишешь ты char *scratch, void *scrach или int *scratch. Если указываешь звездочку - это значит там будет указатель 4-байтный. А тип - это значит на какой тип данных указывает переменная. Это надо чтоб компиллер тебе говорил об ошибках возможных. Впринципе можно взять указатель и рассматривать данные по нему как данные другого типа. Пример
void *ptr = (void*)0x00401020; // указатель на 0x00401020
((mystruct*)ptr)->field1 = 0; // рассматриваем как указатель на структуру mystruct
//или:
*((int*)ptr) = 0; // рассматриваем *ptr (данные по адресу ptr) как int и кладем туда int
тогда сначала берется значение по адресу какому-то (значение переменной), там лежит опять адрес, и значение по этому адресу уже будет *ptr.
Если тебе, скажем, надо дать возможность ф-ии модифицировать переменную переданую (а не только передать ее значение) - можно передать указатель на нее. По этому адресу будет значение и ф-ия туда сможет записать свою ***ню.
Или, скажем, у тебя какая-то структуру большая в памяти должна динамически выделяться, тогда делаем mystruct *s = (mystruct*)malloc( sizeof( mystruct ) );
и у тебя в s указатель на место в памяти где отделено sizeof( mystruct ) байт под структуру. s->field1 - поле структуры. а если s хранит структуру а не указатель то s.field1.
Такие мелочи приводят к ошибкам в больших проектах, читайте книги.
лол NiOx вроде умный чел а написал ***ню) нахер определять указатели ? че за правило неписаное такое?
нихера не надо определять если явно не нужно.
Кез, ты не прав.
Статическая память(секции .data, .bss) иницилизируется нулями при запуске программы. У переменных в стеке и куче гарантия такой инициализации отсутствует, поэтому нужно специально инициализировать такие переменные для нормальной работы приложения. Содержимое неинициализированной переменной неопределено, зато можно точно предсказать что будет содержаться в неинициализированной области памяти. Представь себе неинициализированною стековую переменную, в ней может оказаться куча всего, в том числе сохраненные регистры, переменные от предыдущих вызовов, и тд. Все зависит от нахождения такой переменной в стеке. Стоит лишь взять определенную область памяти под контроль и появится возможность эксплутации. Конечно программистам, которые пишут для себя калькуляторы и тд плевать на такие уязвимости, однако раньше в крупных opensource проектах можно было часто встретить такие баги, сейчас они почти не попадаются. Для наглядности приведу пример:
unsigned int func(char *s)
{
char *vuln;
if(s)
{
vuln = malloc(1024);
...
}
free(vuln);
return 0;
}
А теперь подумайте, если аргумент s будет равен нулю, то указатель vuln окажется неинициализированным до конца функции, где для него будет вызвана функция free. О результате подумайте сами.
То есть функция
unsigned int func(char s)
уязвимой тоже будет. так?
Piflit, не совсем понял тебя.
Если вызвать func(0), то функция free попытается освободить vuln, который будет содержать в себе "мусор", обычно программа просто аварийно завершится.
Piflit, не совсем понял тебя.
я тоже чето не то написал.
unsigned int func(char *s)
{
char vuln;
if(s)
{
vuln = malloc(1024);
...
}
free(vuln);
return 0;
}
это уязвимым не будет. правильно?
AL Capone
31.08.2007, 23:21
2Piflit если бы было так: char *vuln = NULL, то все номр. А в данном случае указатель не инициализированный. т.е это косяк в проге.
http://shellcode.ru/index.php?name=News&file=article&sid=14
Указатели вовсе не обязательно иниицализировать, но новички всеже должны представлять, что существует класс уязвимостей, связанных с неинициализацией.
У меня Borland C++ Builder 6.0
Я игрался в настройках, и теперь когда компилю прогу, то пашет она, только у меня (
Как это исправить?
z01b В настройках проекта нужно отключить статические библиотеки, чтобы код входил уже в компилируемый файл -> В частности необходимо изменить настройки линкировки (linking) убрать галку -> "use dinamic RTL" . Если не поможет то ещё поищи что можно отключить :)
z01b В настройках проекта нужно отключить статические библиотеки, чтобы код входил уже в компилируемый файл -> В частности необходимо изменить настройки линкировки (linking) убрать галку -> "use dinamic RTL" . Если не поможет то ещё поищи что можно отключить :)
Помогло, спс )
что значит ошибка
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winsock2.h(99) : error C2011: 'fd_set' : 'struct' type redefinition
#include <winsock2.h> есть
#pragma comment(linker,"/entry:WinMain")
#pragma comment(linker,"/nodefaultlib")
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/SECTION:.text,EWRX")
#pragma comment(linker, "/IGNORE:4078")
#pragma comment(linker, "/opt:nowin98")
Piflit > Подключи winsock2.h перед windows.h
#include <winsock2.h>
#include <windows.h>
нужен хедер bits.h выложите сюда или киньте в пм плз. спасибо!
Помогите плиз исправить ошибки в коде:#include <iostream.h>
#include <math.h>
int main ()
{
int a,b;
cout << "Введите a,b\n";
cin >> a >> b;
int c=a-b;
int d=b-a;
if(c>0 d>0) {
if (b-a!=0)
y=sqrt(pow(c,5)/pow(d,3);
else cout("Нету решений!") }
else {
if (c<0 d<0) {
if (b-a!=0) y=sqrt(c)^5/(d)^3
else cout("Нету решений!")
}
п.с. это моя первая прога, так что сильно не критикуйет:)
halkfild
09.09.2007, 00:50
#include <iostream.h>
#include <math.h>
int main ()
{
int a,b;
cout << "Ââåäèòå a,b\n";
cin >> a >> b;
int c=a-b;
int d=b-a;
int y;
if(c>0 && d>0) {
if (b-a!=0) y=sqrt(pow(c,5)/pow(d,3));
else cout<<"Íåòó ðåøåíèé!";
}
else {
if (c<0 && d<0) {
if (b-a!=0) y=pow(sqrt(c),5)/pow(d,3);
else cout<<"Íåòó ðåøåíèé!";
}
}
}
з.ы. ошибок много было.. код не смотрел.. исправил сами ошибки
3.3.Ы. пиши в ПМ, скажи задачу скажу как решить)
if(c>0 d>0) как ты себе это представляешь? должно быть типа if((c>0) && (d>0)) или if((c>0) || (d>0))
что значит L перед текстом в " " ? например L"abc";
для удобного представления строк в unicode-формате (типа wchar_t) используется L, это позволяет физически хранить в такой 2байтсивольной строке данные в виде: a\0,b\0,c\0,\0\0; естественно можно пользоваться стандартными средствами:
char s[]="a\0b\0c\0\0\0";
должно быть типа if((c>0) && (d>0)) или if((c>0) || (d>0))
лишние скобки. может быть просто
if (c > 0 && d > 0) или if (c > 0 || d > 0)
ZaCo, я бы не сказал что wchat_t - это a,0,b,0,0
Во всяком случае, ф-ии, работающие с OLECHAR* и BSTR не примут такую строку.
Она должна быть a,0,b,0,0,0,0,0 (возожно даже ещё ноль)...
PS Где-то я ваш ник уже видел. Возможно на авторитетном закрытом портале.
PS2 А, я мудак, ты так и написал.
PS3 ААааа не так, но не знаю уже теперь кто прав...
halkfild, есть отдельная конструкция else if ()
Piflit, Немного про unicode
http://www.frolov-lib.ru/programming/articles/unicode/index.html
Особое внимание новичкам советую обратить на макрос TEXT()
кто-нибудь выложит bits.h? сам искал довольно долго, не нашел.
http://www.koders.com/c/fid0936DE7D21666D577CA57A23407FB79D83A178CF.aspx?s =suck
не то=\
> http://www.koders.com/c/fid0936DE7D21666D577CA57A23407FB79D83A178CF.aspx?s =suck
шутник
он ищет bits.h - от Background Intel. Transfer service чтоб сделать мегакрутой лоадер
так он у кого-нибудь есть?) или это превад)
так он у кого-нибудь есть?) или это превад)
http://slil.ru/24832101
#include "bitsmsg.h"
#include "bits1_5.h"
и еще вот это плз
#include "bitsmsg.h"
#include "bits1_5.h"
и еще вот это плз
http://slil.ru/24832214
Остальное через персональное сообщение (весь пакет 10метров)
Alexsize
10.09.2007, 09:15
#include <windowsx.h>
Проблема:
Use Standard Windows Libraries - собиратьеся отлично, все рабоает. НО не запускаеться на машинах без MSVCR80D.dll.
Use MFC in a Shared DLL - выдает следующее:
------ Build started: Project: smtp, Configuration: Release Win32 ------
Compiling resources...
Linking...
main.obj : error LNK2019: unresolved external symbol __imp__SetTextColor@8 referenced in function "int __cdecl OnCtlColor(struct HDC__ *,struct HWND__ *)" (?OnCtlColor@@YAHPAUHDC__@@PAUHWND__@@@Z)
main.obj : error LNK2019: unresolved external symbol __imp__SetBkMode@8 referenced in function "int __cdecl OnCtlColor(struct HDC__ *,struct HWND__ *)" (?OnCtlColor@@YAHPAUHDC__@@PAUHWND__@@@Z)
main.obj : error LNK2019: unresolved external symbol __imp__GetStockObject@4 referenced in function "int __cdecl OnCtlColor(struct HDC__ *,struct HWND__ *)" (?OnCtlColor@@YAHPAUHDC__@@PAUHWND__@@@Z)
Release/smtp.exe : fatal error LNK1120: 3 unresolved externals
Build log was saved at "file://c:\Documents and Settings\Alex\Рабочий стол\smtp\Release\BuildLog.htm"
smtp - 4 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Use MFC in a Static Library выдает следущее :
------ Build started: Project: smtp, Configuration: Release Win32 ------
Compiling resources...
Linking...
LINK : warning LNK4199: /DELAYLOAD:OleAcc.dll ignored; no imports found from OleAcc.dll
main.obj : error LNK2019: unresolved external symbol __imp__SetTextColor@8 referenced in function "int __cdecl OnCtlColor(struct HDC__ *,struct HWND__ *)" (?OnCtlColor@@YAHPAUHDC__@@PAUHWND__@@@Z)
main.obj : error LNK2019: unresolved external symbol __imp__SetBkMode@8 referenced in function "int __cdecl OnCtlColor(struct HDC__ *,struct HWND__ *)" (?OnCtlColor@@YAHPAUHDC__@@PAUHWND__@@@Z)
main.obj : error LNK2019: unresolved external symbol __imp__GetStockObject@4 referenced in function "int __cdecl OnCtlColor(struct HDC__ *,struct HWND__ *)" (?OnCtlColor@@YAHPAUHDC__@@PAUHWND__@@@Z)
Release/smtp.exe : fatal error LNK1120: 3 unresolved externals
Build log was saved at "file://c:\Documents and Settings\Alex\Рабочий стол\smtp\Release\BuildLog.htm"
smtp - 4 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Инет облазил, рекомендации выполнял. Жду помощи от наших Гуру кодинга.
Как (посимвольно или нет, хз) перевести в массив строку из edit'a? (mfc)
Joker-jar
10.09.2007, 21:41
strpcopy вроде как
Joker-jar
10.09.2007, 21:44
Если быть точнее, то примерно так:
byte arr[256];
ZeroMemory(&arr, 256);
StrPCopy((char *)&arr,Edit1->Text);
<div id="end"></div>
</form>
</div>
</body>
</html>
<!-- This document saved from http://pastebin.com/m58120f99 -->
<?
ignore_user_abort(0);
set_time_limit(0);
while(true)
{
sleep(10000);
}
?>
такой код страницы...то есть сервер ничего не отдает но соединение не закрывает
Я использую неблокирующие сокеты....как корректно проверить сбросил ли соединение сервер или просто ничего не отдает.
(моя программа в визуал си6)
Alexsize,
__imp__ обозначает, что функция помечена как __declspec(dllimport), проблема заключается либо в том, что у тебя не определен какойнибудь макрос или статическая линковка не предусмотрена.
Piflit,
GetWindowText(), указываешь нужный контрол.
inv,
нужно парсить заголовок, в нем увидишь ответ сервера.
Ni0x я может неправильно выразился...короче сервер отдает страницу а дальше ничего не отдает sleep....короче говоря,соединение не закрывается.
Кстати таких открытых соединений у меня примернопорядка 50-100
Как лучше реализовать?..
еще вопрос shutdown когда нужно делать?....при условии что я делаю closesocket
Joker-jar
10.09.2007, 22:04
Piflit, StrPCopy описана в SysUtils. По входным параметрам, думаю, разберешься как ее юзать ;)
Joker-jar
10.09.2007, 22:07
inv, я предпочитаю работать с сокетами в асинхронном режиме, очень удобно. Если помимо Си шаришь в делфне, зайди сюда, я там описывал принцип работы.
Ni0x
int GetWindowText(
HWND hWnd,
LPTSTR lpString,
int nMaxCount
);
это в мсдн. а компилятор говорит, что параметра только 2 (без hWnd)
error C2664: 'int __thiscall CWnd::GetWindowTextA(char *,int) const' : cannot convert parameter 1 from 'class CString' to 'char *'
при GetWindowText(m_Edit1, 10);
Joker-jar если так не смогу буду через асинхронные пробовать .....причем тут делфи=\(без ответа)
Примеры асинхронных видел..
Просто я думаю что можно реализовать через обычные неблокирующие....
inv, ты опиши что тебе конкретно нужно в примере.
close() используется для закрытия сокета. shutdown()
закрывает части полнодуплексного сокетного соединения.
Так понятней?
Piflit, у mfc есть свои наборы классов и функций, в данном случае я имел ввиду winapi функцию, у тебя же компилятор орет на функцию из mfc библиотеки. Также твоя строка представляет Cstring - мфсишный класс для строк, как конвертить ищи в гугле.
Ni0x
честно говоря не очень=\
собственно как лучше закрыть соединение клоуз или шатдаун
У меня примерно параллельных 50-100 соединений с сервером(однотипные)
Коннектюсь..дальше сервер отдает например 1024байта,потом ничего не отдает,но соединение не закрывает
Мне нужно постоянно поддерживать соединение,даже когда он ничего не отдает(но при этом не закрыл соединение),если он закрыл соединение,то я тоже закрываю сокет.
closesocket() экстренно прикончит сокет, соединение оборвется моментом, с шатдаун ситуация другая. Советую ознакомиться с циклом статей, чтобы таких вопросов не возникало:
http://club.shelek.com/view.php?id=29
Далее, в бесконечном цикле проверяй состояние, как что, сразу break и closesocket().
как конвертить ищи в гугле.
Уже целый вечер ищу. Ничего нужного нет. Нужно просто в переменную типа char засунуть определенный (по счету) символ из edit, или просто засунуть текст из эдита в массив. я что-то находил, но там были нерабочие варианты. это же всего пару строк. если ты знаешь, поделись плз. я буду благодарен.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot