Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Python: спам по сокету

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый вечер.
Есть скрипт, который открывает сокет, и при подключении к нему, пользователь получает определенную информацию.
К сокету есть 2 вида подключения (с игры и с сайта)
 
Если подключиться с сайта - так всё работает корректно.
Если подключится с игры - начинается бесконечный спам.
 
 
Вот как я отправляю данные:

Код:
def parserecvdata(addr,data):
    global ms_userip
    
    if data.find('cstrike') > 1 and data.find('0.0.0.0:0') > 1:
        print (datetime.datetime.now().strftime('%d/%m/%Y - %H:%M:%S: ')) + (str(addr).strip("(").strip(")").replace(",", "").replace("'","", 2)) + " - cs client detected"
        s.sendto(csd,addr)
        s.close
        time.sleep(1.0)
        ms_userip = filter(lambda i:i==[addr[0]],ms_userip)

 
 
а вот, собственно сам сокет:

Код:
def serve_forever():
    global s
    global ms_userip
    
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.bind(('localhost',27010))
    skiperrnogs54 = "0"
    
    while 1:
        try:
            data,addr = s.recvfrom(1024)
        except Exception, e:
            print (datetime.datetime.now().strftime('%d/%m/%Y - %H:%M:%S: ')) + str(e) + "Connection reset by peer"
            s.close
            skiperrnogs54 = "1"
            pass
        
        if skiperrnogs54 == "1":
            skiperrnogs54 = "0"
        else:
            if addr[0] in ms_userip:
                pass
            else:
                ms_userip = ms_userip + [addr[0]]
                
                try:
                    thread.start_new_thread(parserecvdata,(addr,data))
                except Exception, e:
                    print (datetime.datetime.now().strftime('%d/%m/%Y - %H:%M:%S: ')) + "Error: %s" %e
                    s.close

 
 
не понимаю, почему спам идет.

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:28 05-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
начинается бесконечный спам

а расшифровать?

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 22:32 05-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
а расшифровать?

бесконечно повторяется строчка ".... cs client detected"
пока в клиенте не отключишься.

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:38 05-06-2015 | Исправлено: Sutar, 22:38 05-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
может клиент не получает ожидаемый ответ и повторяет запрос? хорошо протокол изучили?

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 22:50 05-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Да, ошибка в этом.
поставил limit на 3 записи (чтоб ответ был в 3-х строчках)
и всё работает отлично.
 
а как тогда профиксить эту неполадку?
time.sleep - не подойдет... количество записей может сменятся от 100 до 10000 и время ответа будет разное(

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:54 05-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
а как тогда профиксить эту неполадку?  

изучить протокол и понять что ожидает клиент. без точного знания используемого протокола это лишь какие то заплатки.

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 22:56 05-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
а можно как-то процикловать ответ?
например отправлять не все сразу, одновременно записи, а по одной? Думаю клиенту хватит времени всё обработать. Только вот как это сделать...

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:59 05-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
например отправлять не все сразу, одновременно записи, а по одной?

еще раз - я не знаю ничего об используемом протоколе. изучите и поймете.

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 23:01 05-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Такой вопрос.
Про соединение Python с сервером.
 

Код:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('16.174.38.18',80))
s.send('hello')
buffer = s.recv(4096)
print 'socket: ', buffer

 
как установить timeout для соединения?
 
думаю сделать так:

Код:
s = socket.create_connection(('36.174.18.18',80), timeout=3)

но тут ошибка.... 10061
 
Получилось реализовать так:

Код:
 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(1)
s.settimeout(3)
try:
    s.sendto('hello', ('36.174.18.18',80))
except Exception, e:
    print "Could not open socket: %s" %e
    return 0

 
timeout - работает. Идет ожидание ответа 3 секунды.
Но тут не удобно с стороны программирования, мне нужно отправить до 7 запросов, и получить 7 ответов, но если отправлять с помощью последнего примера, так это адрес, куда отправлять будет вписываться 7 раз... Не удобно(
Что посоветует? Можно как-то в первом примере сделать timeout, для ожидания ответа?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 14:01 16-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
а что мешает сделать  
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
s.setblocking(1)  
s.settimeout(3)  
и далее как обычно?  

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 20:16 16-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 

Код:
<class 'socket.timeout'>

если проходит время timeout, то выдает такую ошибку. Как обработать?
 

Код:
try:
    s.connect(('136.174.13.18',80))
except Exception, e:
    print "Could not open socket: %s" %e
    return 0

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 20:46 16-06-2015 | Исправлено: Sutar, 20:51 16-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
 
try:  
    s.connect(('146.174.48.18',27254))  
except Exception, e:  
    print "Could not open socket: %s" %e  
    return 0

не работает?

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 20:50 16-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
не работает?

выдает такое сообщение

Код:
<class 'socket.timeout'>

вот весь код:

Код:
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setblocking(1)
    s.settimeout(3)
    try:
        s.connect(('143.454.28.11',80))
    except Exception, e:
        print "Could not open socket: %s" %e
        return 0
except socket.error, (value,message):
    print "Could not open socket: " + message

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 20:52 16-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
вот весь код:  

не уверен, что вложенность try/except хорошая идея
https://docs.python.org/3/glossary.html#term-eafp
но у меня в 2.7 такое не выдает. какая версия питона то?
 
если сделать ошибку в адресе - перехватывает внутренний except без проблем.

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 21:04 16-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Python 2.7.8
 
Если указать сервер, который даст ответ (быстро), то всё работает хорошо.
Но если указать сервер, который не существует (выключен временно) или долго ждет ответ от существующего сервера, то выдает ошибку. <class 'socket.timeout'>
 

Код:
 
D:\localhost\ms>server.py
 
16/06/2015 - 21:10:13: Start chech server
<class 'socket.timeout'>
 
D:\localhost\ms>pause
Для продолжения нажмите любую клавишу . . .

 

Код:
try:
    import socket,MySQLdb,sys,thread,time,datetime
except Exception, e:
    exit
 
def load_servers2():
    global data
    try:
        
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        
    except socket.error, (value,message):
        print "Could not open socket: " + message
    try:
        s.setblocking(1)
        s.settimeout(3)
        s.sendto('hello', ('146.174.48.18',80))
    except Exception, e:
        print "Could not open socket: %s" %e
        return 0
    
    buffer = s.recv(4096)
    s.close()
    print 'socket: ', buffer
 
def load_servers():
    global data
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setblocking(1)
        s.settimeout(3)
        try:
            s.connect(('146.174.48.18',80))
        except Exception, e:
            print "Could not open socket: %s" %e
            #return 0
    except socket.error, (value,message):
        print "Could not open socket: " + message
    s.send('hello')
    buffer = s.recv(4096)
    s.close()
    print 'socket: ', buffer
 
try:
    print "\n" + (datetime.datetime.now().strftime('%d/%m/%Y - %H:%M:%S: ')) + "Start chech server"
    load_servers()
    print "\n\n\n2:\n"
    load_servers2()
except:
    print sys.exc_info()[0]
 

 
кстати, до load_servers2() - дело не доходит. Текст 2: - не печатает(

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:12 16-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
то выдает ошибку. <class 'socket.timeout'>  

потому, что перехватывает внешний except

Цитата:
print sys.exc_info()[0]  


Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 21:17 16-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
а как перехватывать на внутренний?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:18 16-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
а как перехватывать на внутренний?

 
1) не делать кучу ненужных блоков.
 

Цитата:
try:  
    print "\n" + (datetime.datetime.now().strftime('%d/%m/%Y - %H:%M:%S: ')) + "Start chech server"  
    load_servers()  
    print "\n\n\n2:\n"  
    load_servers2()  
except:  
    print sys.exc_info()[0]  

зачем вот тут вообще это нужно?
 
2) помещать s.send, s.recv внутрь такого блока, ведь он и бросает ошибку, а не функция подключения
поэтому внешний except и перехватывает, а не внутри функции.

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 21:28 16-06-2015 | Исправлено: Mavrikii, 21:30 16-06-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
да это для теста
как вообще лучше реализовывать коды?
 
лучше оставшийся код вкладывать в try
К примеру так:

Код:
try:
    import socket,MySQLdb,sys,thread,time,datetime
except Exception, e:
    exit
 
def load_servers():
    global data
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setblocking(1)
        s.settimeout(3)
        try:
            s.connect(('127.0.0.1',80))
            try:
                s.send('hello')
                try:
                    buffer = s.recv(4096)
                    buffer = buffer[4:]
                    if ord(buffer[0]) == 0:
                        print "Server is offline"
                    if ord(buffer[0]) == 109:
                        print "Server is online (109)"
                    if ord(buffer[0]) == 73:
                        print "Server is online (73)"
                    print 'socket: ', buffer
                except Exception, e:
                    print "Error socket.recv: %s" %e
            except Exception, e:
                print "Error socket.send: %s" %e
        except Exception, e:
            print "Error socket.connect: %s" %e
        s.close()
    except Exception, e:
        print "Error socket.socket: %s" %e
 
try:
    print "\n" + (datetime.datetime.now().strftime('%d/%m/%Y - %H:%M:%S: ')) + "Loading server"
    load_servers()
except:
    print sys.exc_info()[0]

 
или как вы посоветуете?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:30 16-06-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
или как вы посоветуете?

http://stackoverflow.com/questions/17015230/are-nested-try-except-blocks-in-python-a-good-programming-practice

Всего записей: 15582 | Зарегистр. 20-09-2014 | Отправлено: 21:32 16-06-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Python: спам по сокету


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru