Mail.ru SMS sender

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Gar|k, 5 Aug 2009.

  1. buxmanager

    buxmanager Elder - Старейшина

    Joined:
    1 Apr 2009
    Messages:
    610
    Likes Received:
    229
    Reputations:
    69
    указал номер верно, указал текст верно) и дулька)))
     
    1 person likes this.
  2. AKYLA

    AKYLA Elder - Старейшина

    Joined:
    29 Nov 2007
    Messages:
    108
    Likes Received:
    35
    Reputations:
    6
    Gar|k
    А можно детальнее про временные интервалы, кроме одной минуты и 50 смс в день?
     
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    AKYLA, когда я в прошлом году сделал этот клиент я попробывал написать рассылку, но тут же столкнулся с проблемой минутного интервала. Писать обработку сообщений сервера мне было лень и я забросил эту идею. Попробуй, потестируй, погляди что возвращает сервер, обычно это сообщение (1036 вроде) в котором текстом в rtf объясняется причина по которой СМС не может быть доставлена.
     
    _________________________
  4. buxmanager

    buxmanager Elder - Старейшина

    Joined:
    1 Apr 2009
    Messages:
    610
    Likes Received:
    229
    Reputations:
    69
    так почему не отправляется то? не могу понять:) извините за непонимание, но все верно указываю!
     
  5. AKYLA

    AKYLA Elder - Старейшина

    Joined:
    29 Nov 2007
    Messages:
    108
    Likes Received:
    35
    Reputations:
    6
    Gar|k
    Ну я пока нашел ограничения это - минута, через 10 сообщений если тебе не отвечает абонент так же смс'кой то ты блокируешься на 24 часа. (хитро придумано, ведь ответные смс с тела на агент платные )))
    Тесты показали, если с нового ака маил.ру пытаться отправить, ничего не будет, для этого обязательно нужно в контакты занести хотя бы один контакт с номером (потом его можно и удалить) и только тогда будет возможность отсылать без маил агента.
     
  6. buxmanager

    buxmanager Elder - Старейшина

    Joined:
    1 Apr 2009
    Messages:
    610
    Likes Received:
    229
    Reputations:
    69
    понятно почему не отправлялосЬ))))
     
  7. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    А какие ещё есть ограничения?На номер телефона,айпи,или номер мобилы и айпи?
     
  8. ky_kask

    ky_kask Member

    Joined:
    18 Nov 2009
    Messages:
    74
    Likes Received:
    81
    Reputations:
    6
    "Бороть" 50 СМС в сутки или 1 минуту не надо. В 1 поток быстрее чем 1 СМС в секунду не отшлешь. Решение - Вешаем 1К акков и вперед. По одному на секунду в цикле 50.
    Добавление/удаление телефона в контакты не нужно. Для отправки СМС нужно чтобы хотя бы в один контакт был добавлен номер телефона. Решение - добавляем любой "левый" номер в контакт Support (по умолчанию он у любого акка есть), а потом шлем СМС на любой нужный номер. Вот этот самый номер в контакты можно не писать. Все равно отправляет. Можно добавить проверку на наличие номеров в контактах акка, тогда вообще остается только отправить СМС-ку безо всяких добавлений. ИП вроде не "палится", но это надо массово проверять..

    Удачных экспериментов.
     
    #28 ky_kask, 28 Feb 2010
    Last edited: 28 Feb 2010
  9. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    У меня ип от таких приколов в бан на 3е суток уходил где то на 15 - 20й смске
     
  10. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Gar|k как думаеш это пдойдет для асинхронных ответов серверу ?
    отбработки ошибок нет для наглядности

    Code:
    
    typedef struct THREAD_INFO
    {
    	CONST PCHAR pMsg;
    	HANDLE hCompleteInit;
    } THREAD_INFO, *PTHREAD_INFO;
    
    DWORD WINAPI SendThread(PTHREAD_INFO th)
    {
    	SOCKET s;
    	PCHAR pMsg = malloc(strlen(th->pMsg)+1);
    	strcpy(pMsg, th->pMsg);
    	SetEvent(th->hCompleteInit); /* SendMsg выходиь из ожидания и завершается */
    	s = conct(MmpAddr); /* connect */
    	send(s, pMsg, strlen(pMsg), 0);
    	free(pMsg);
    	closesocket(s);
    	return ERROR_SUCCESS;
    }
    
    VOID SendMsg(CONST PCHAR pMsg)
    {
    	HANDLE hThread;
    	THREAD_INFO th = {pMsg};
    	th.hCompleteInit = CreateEvent(NULL, FALSE, FALSE, NULL);
    	hThread = CreateThread(NULL, 0, SendThread, &th, 0, NULL);
    	WaitForSingleObject(th.hCompleteInit, INFINITE);
    	CloseHandle(th.hCompleteInit);
    	CloseHandle(hThread);
    }
    
    
    идея такая чтоб если надо часто отправлять ответы количество одновременно работающих потоков увеличивалось все равно они все на вводе выводе приостановятся чтоб отправлять за раз много ответов а когда запросы нечастые нет ни одного потока
    крутил крутил как сделать получилось это затраты на создание структур ядра потока и помещение его в очередь небольшие но все равно мне не нравится решение с постоянным созданием потоков сначал думал держать поток на событии но потом прикинул что мне надо например 10 потоков отправляли одновремено 10 событий ?
    1 если собитые то или один поток проснется если с автосбросом или все если с ручным сбросом один если просыпатся будет неподходит так как отправка тогда не асинхронно будет выполнятся все тоже не пойдет если я передаю один запрос всего в минуту да и вот еще что допустим из какого то потока вызов SendMsg("MRIM_CS_HELLO"); так как вызов асихронный то она вернет управление и выйдет из функции ее вызывавшей буфер разрушится когда поток получит время начнет отсылать и прочитает из стека черти что поэтому пришлось сделать так
    тут блокируем вызывабщий поток пока поток когда получит время не скопирует себе строку в кучу
    Code:
    th.hCompleteInit = CreateEvent(NULL, FALSE, FALSE, NULL);
    hThread = CreateThread(NULL, 0, SendThread, &th, 0, NULL);
    WaitForSingleObject(th.hCompleteInit, INFINITE);
    
    а поток когда проснется первым делом скопирует строку
    Code:
    PCHAR pMsg = malloc(strlen(th->pMsg)+1);
    strcpy(pMsg, th->pMsg);
    SetEvent(th->hCompleteInit);
    
    маякнет вызывающему потоку что он закончил тот выйдет из вызова
    SendMsg("MRIM_CS_HELLO");
    и можно уже не опасатся из какого контекста вызывалась функция фактически только задержка на событии для копирования строки получается но мне это не нравится как то есть идеи как лучше отправку организовать ?
    еще вариант с пулом поколдовать там хоть не надо создавать треды так часто
    QueueUserWorkItem
    в коде фактически придется только заменить CreateThread на QueueUserWorkItem
    наверно эффективней должно быть хоть потоки завершатся не будут
    набрел на твою статью решил поигратся с протоколом )))
    кстати запости заголовок пакета которые отправляются перед сообщением который а то у меня маил агентов нет а ставить че то как то не очень то и надо ))
    фактически вот сразу попробовал решение с пулом потоков вот что получилось

    Code:
    
    typedef struct THREAD_INFO
    {
    	CONST PCHAR pMsg;
    	HANDLE hCompleteInit;
    } THREAD_INFO, *PTHREAD_INFO;
    
    DWORD WINAPI SendThread(PTHREAD_INFO th)
    {
    	SOCKET s;
    	PCHAR pMsg = malloc(strlen(th->pMsg)+1);
    	strcpy(pMsg, th->pMsg);
    	SetEvent(th->hCompleteInit);
    	s = conct(MmpAddr);
    	send(s, pMsg, strlen(pMsg), 0);
    	free(pMsg);
    	closesocket(s);
    	return ERROR_SUCCESS;
    }
    
    VOID SendMsg(CONST PCHAR pMsg)
    {
    	THREAD_INFO th = {pMsg};
    	th.hCompleteInit = CreateEvent(NULL, FALSE, FALSE, NULL);
    	QueueUserWorkItem(SendThread, &th, 
    		WT_EXECUTEDEFAULT|WT_EXECUTELONGFUNCTION);
    	WaitForSingleObject(th.hCompleteInit, INFINITE);
    	CloseHandle(th.hCompleteInit);
    }
    
    
    работает много параллельных запросов из пула данные тоже корректно на событии
    копируются вызывающий поток который хочеит отправить сообщение ждет только
    пока потоку в пуле выделится время он скопирует пакет себе в память и тут же освобождает поток который хочет отправить сообщение
    уже что то ))

    есть мысли как сделать лучше ?))
     
  11. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    greki_hoy o_O :)

    посмотри это
    массив сокетов и те же потоки приема и отправки. (сейчас понимаю что прием лучше было бы реализовать через select)

    А вообще обмен с клиентом идет асинхронно... и стоит задуматься не проще ли использовать асинхронные сокеты? ) (я с ними никогда не работал... статейка так ничего)

    Вон прочитай выше статью и обрати внимание на описание WSAEventSelect. Я удмаю реально запихнуть весь клиент в одну функцию, а потом просто делать много потков на нее основе.
     
    _________________________
  12. Leon2009

    Leon2009 New Member

    Joined:
    1 Sep 2009
    Messages:
    44
    Likes Received:
    0
    Reputations:
    0
    а есть на короткие намера? отправлять отправляю а принимать то незнаю как?
     
  13. Life7

    Life7 Banned

    Joined:
    14 Jun 2009
    Messages:
    150
    Likes Received:
    54
    Reputations:
    0

    на киевстар не доходит