Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6310
Последний выпуск: 19.06.2015

[python] Работа с сокетами

56K
31 января 2012 года
an1s1
47 / / 03.01.2012
Есть локалка, есть комп в ней с выходом в инет. Нужно на нем сделать "зеркало" smtp сервера(должено стать мостом с локалки в инет). Весь трафик, поступающий на 1025 порт прога должна перенаправлять на 25-й порт smtp.mail.ru и возвращать назад ответы.
Все, что мне удалось содрать это:
Код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import socket

ohost = "smtp.mail.ru"
oport = 25
 
o = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
o.connect((ohost, oport))

def send(data):
    o.send(data)
    return o.recv(1024)

def getline():
    t=sock.recv(1024)
    out=""
    while t!="\r\n":
        out=out+t
        t=sock.recv(1024)
    return out

host = "localhost"
port = 1025
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(5)
sock, addr = s.accept()
while True:
    buf = getline()
    print buf
    if buf == "exit":
        sock.send("bye")
        break
    elif buf:
        sock.send(send(buf))
sock.close()

Но поскольку я переделывал код, который выполнял совершенно другие задачи, да еще и недоконца понимаю его, то очевидно, что он не работает. Мож даст какой добрый человек ссылку на толковую статью или исправит ошибки в данной проге(есть подозрения, что проще полностью переписать ее)? Заранее спасибо за любую помощь.
277
01 февраля 2012 года
arrjj
1.7K / / 26.01.2011
А iptables не? В чем секрет таких плясок?
56K
01 февраля 2012 года
an1s1
47 / / 03.01.2012
В незнании, что такое iptables и как им пользоваться:)
56K
01 февраля 2012 года
an1s1
47 / / 03.01.2012
Ага, нашел еще одну причину -- у мя нет root'а на серваке.
277
01 февраля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: an1s1
В незнании, что такое iptables и как им пользоваться:)



man iptables

google iptables

iptables -t nat -A PREROUTING -p tcp --dport 1025 -j REDIRECT --to smtp.mail.ru:25

^^ну както так

56K
01 февраля 2012 года
an1s1
47 / / 03.01.2012
Цитата:

man iptables

google iptables

iptables -t nat -A PREROUTING -p tcp --dport 1025 -j REDIRECT --to smtp.mail.ru:25

^^ну както так


Уже нашел. Нашел еще, что нужны права root'а. Это правда?

277
01 февраля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: an1s1
Уже нашел. Нашел еще, что нужны права root'а. Это правда?



Да, для разовой настройки.

А то что у тебя нет рута на серваке, значит у тебя есть su или sudo. Какая система то?

56K
01 февраля 2012 года
an1s1
47 / / 03.01.2012
FreeBSD 8 и нет пароля root'а
240
01 февраля 2012 года
aks
2.5K / / 14.07.2006
Без админских привилегий ты в любом случае этого не сделаешь. Или получай права админа или забудь про свою задачу.
56K
01 февраля 2012 года
an1s1
47 / / 03.01.2012
Но, насколько мне известно, питон может слушать порты и передавать информацию по сокетам и без прав админа.
240
01 февраля 2012 года
aks
2.5K / / 14.07.2006
Слушать да, только вот я не понял, вам просто порт надо слушать или любой траффик на этом компе на определенный порт (не обязательно на этот хост) заворачивать? Если второе - то тут правилами iptables легко решается. Если же надо просто порт слушать на проксировать запросы далее - тогда это решается легко абсолютно на любом языке умеющих работать с сокетами. Даже странно почему выбран именно питон.
56K
01 февраля 2012 года
an1s1
47 / / 03.01.2012
Вот и хотелось бы найти небольшую статью по простому проксированию запросов(недесь правильно написал). А питон, потому что простой, везде поддерживается, большая комьюнити.
240
01 февраля 2012 года
aks
2.5K / / 14.07.2006
Так а какая там может быть статья - получаете подключение, коннектитись к мэйл.ру и далее работаете с каждой такой парой сокетов. Все что пришло от пользователя отсылается на мэйлру и все что пришло оттуда - пользователю. Где именно тут непонятно?
А насчет простого - ну на мой взгляд работа с сетью даже в простом C была бы проще наверное. =)
240
01 февраля 2012 года
aks
2.5K / / 14.07.2006
Конкретно по вашему коду: у вас возможно подключение только одного пользователя - это противоречит условию задачи, насколько я понимаю. И некорректное условие окончания сообщения. Функция send странная - непонятно зачем там вычитывание килобайта в конце.
И наконец тут обработка только подключения от пользователя, но совсем нет работы с подключением до мэйл.ру.
56K
01 февраля 2012 года
an1s1
47 / / 03.01.2012
По поводу одного пользователя, да это неправильно, по поводу некоректного окончания, я не согласен, ведь когда приходит quit моя прога просто вырубалась бы. А send -- мое извращение, неудивительно, что человек, непонимающий до конца что он делает, неписал нечто кривое и бесполезное.
Немогли бы Вы дать мне приблизительный алгоритм работы, что бы я мог по нему делать свою прогу? Ну и толковая стать о сокетах не помешала бы. Заранее спасибо.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог