Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

25.08.2009, 11:47
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
Спасибо конечно, но проблему решил
Код:
string substr(const string &str, int start, int length)
{
if (start < 0 ) start+=str.length();
if (length < 0 ) length=str.length()+length-start;
if (length < 0 ) return "";
return str.substr(start,length);
}
Возникла новая проблема с winsock или _beginthread - точно не знаю. Если вызывать вот это http://forum.antichat.ru/showpost.php?p=373579&postcount=6 один раз, или по очереди (я изменил буффер до 5120 вместо 1023), товсе ок, принимается 5кб, но если же с помощью
Код:
_beginthread(Thread, 0, NULL); //Thread - void Thread (void *a) {http://forum.antichat.ru/showpost.php?p=373579&postcount=6}
то принимается 2кб... В чем может быть проблема? УРЛ/ip подключения есс-но сменил.
|
|
|

25.08.2009, 12:04
|
|
Познающий
Регистрация: 29.01.2008
Сообщений: 82
Провел на форуме: 373690
Репутация:
88
|
|
Тебе именно 5 кб нужно принять? Пропробуй через while принимать пока не получишь 5 кб.
Получишь весь ответ полностью...
PHP код:
char response[1024]; // буффер под ответ
while( recv(my_sock,(char*)response,sizeofresponse),0)!=SOCKET_ERROR && strlen((const char *)response)!=0)
{
printf("%s\n",response);
ZeroMemory(response,sizeof(response));
}
Если нужно получать часть ответа и рвать соеденение - можно попробывать считать полученные данные...
PHP код:
#define max_response_len 5120 // 5кб))
char response[1024]; // буффер под ответ
int response_len = 0;
while( recv(my_sock,(char*)response,sizeofresponse),0) != SOCKET_ERROR && strlen((const char *)response)!=0 && response_len < max_response_len)
{
printf("%s\n",response);
response_len+=strlen((const char *)response);
ZeroMemory(response,sizeof(response));
}
|
|
|

25.08.2009, 12:18
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
озникла новая проблема с winsock или _beginthread - точно не знаю.
Код в студию ...
|
|
|

25.08.2009, 12:49
|
|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме: 991929
Репутация:
395
|
|
2 Smapt ппц код... && strlen((const char *)response)!=0 вот это ваще лишнее int recv возвращает количество принятых байт его и нужно проверять
вообще чтобы точно в своей программе быть уверенем приняли ли вы все или отправили все нужные данные лучше пользоватся такими функциями вместо recv и send
Код:
//---TCP/IP функции
// отослать ВСЕ ... - правильная функция
int sendall(SOCKET s, char *buf, int len, int flags)
{
int total = 0;
int n;
while(total < len)
{
n = send(s, buf+total, len-total, flags);
if(n == -1) { break; }
total += n;
}
return (n==-1 ? -1 : total);
}
// принять ВСЕ ... - правильная функция
int recvall(SOCKET s, char *buf, int len, int flags)
{
int total = 0;
int n;
while(total < len)
{
n = recv(s, buf+total, len-total, flags);
if(n == -1) { break; }
total += n;
}
return (n==-1 ? -1 : total);
}
|
|
|

25.08.2009, 12:59
|
|
Познающий
Регистрация: 29.01.2008
Сообщений: 82
Провел на форуме: 373690
Репутация:
88
|
|
2Gar|k, ну да, в теории ты прав... а на практике у меня получалось что сервер принимающий без "&& strlen((const char *)response)!=0" зацикливался при некоректном отключении клиента  (например при плохом сетевом соеденении)... Понимаю, звучит это как-то бредово но нечего другого кроме strlen не помогло.
|
|
|

25.08.2009, 13:11
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
Такс... Проблему решил  С циклом все ок работает. Но опять новая проблема =\
PHP код:
void BlaBlaBla( void *a)
{
int i;
Get("/forum/profile.php?mode=viewprofile&u="+IntToStr(1000+i).c_str(),"tfile.ru"); // тут орет invalid pointer addition.
i++;
}
void Get(char *url, char *host)
{
BlaBlaBla
}
Задолбали эти типы данных в c++ =\ Конвертировать только  Как это решить?
|
|
|

25.08.2009, 13:18
|
|
Познающий
Регистрация: 29.01.2008
Сообщений: 82
Провел на форуме: 373690
Репутация:
88
|
|
PHP код:
void BlaBlaBla( void *a)
{
int i;
Get("tfile.ru","/forum/profile.php?mode=viewprofile&u=%d",1000+i);
i++;
}
void Get(char* host, char * Format, ...)
{
va_list ap; // For arguments
va_start( ap, Format );
int buff_size = _vscprintf(Format,ap)+1;
char * buff = new char[buff_size];
vsprintf(buff,Format,ap);
//В переменной buff будет строчка "/forum/profile.php?mode=viewprofile&u=1000" (или не 1000 зависит от того что передашь)
va_end ( ap );
delete[] buff;
}
Последний раз редактировалось Smapt; 25.08.2009 в 13:25..
|
|
|

25.08.2009, 13:37
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
Код:
void Get(char* host, char * Format, ...)
1. Вместо троеточия что?
2. Теперь ошибка, что ф-ции нету _vscprintf.
|
|
|

25.08.2009, 13:44
|
|
Познающий
Регистрация: 29.01.2008
Сообщений: 82
Провел на форуме: 373690
Репутация:
88
|
|
<stdio.h> подключена? Нужно именно проеточие... Функция будет работать по принципу функции printf, в переменную format передаётся "маска" напимер "name %s age %d\n" а в "троеточие" передаётся набор параметров:
PHP код:
char * name = "nikolay";
int age = 18;
printf("name %s age %d\n",name,age);
//выведит строку "name nikolay age 18"
точно так же будет работать и твой Get.
|
|
|

25.08.2009, 14:01
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
Подключена.
ЗЫ: Работаю в Borland C++ Builder 6
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|