Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 3

Port Forwaring

22.05.2017, 17:32. Показов 798. Ответов 4

Студворк — интернет-сервис помощи студентам
У меня вот такой вот вопрос. Есть программа, что должна считывать динамически изменяемый файл, и собирать данные веса и связанный с ним ip address. Далее эта программа слушает весь траффик с 80 порта, и перенаправляет его на один из серверов в кластере, чей ip указан в файле. При этом сервер выбирается на основе веса.

Программа успешно считывает файл, открывает сокеты, принимает соединения, но не перенаправляет данные. Ниже пример программы, что я делаю не так?

Проблема в этой части: def forward(source, destination):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import socket
import sys
import threading
import time
import math
import functools
from operator import itemgetter
 
settings = list()
weight_list = list()
minus_list = list()
 
def __getitem__(self, row):
    return self.data[row]
 
def gcd(L):
    return functools.reduce(math.gcd, L)
 
def main(setup, error):
    sys.stderr = open(error, 'a')
 
    for line in open(setup):
        parts = line.split()
        weight_list.append([int(parts[0]), parts[1], int(parts[2]), int(parts[3]), int(parts[4]), int(parts[5])])
    settings = list(weight_list)
    for i in range(len(settings)):
        minus_list.append(settings[i][5])
    minus = gcd(minus_list)
    settings.sort(key=itemgetter(5), reverse=True)
    setting = tuple(settings[0])
    settings[0][5] = settings[0][5]-minus
    threading.Thread(target=server, args=(settings, setup, minus, setting)).start()
 
def server(settings, setup, minus, setting):
        try:
                dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                dock_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
                dock_socket.bind(('', 80))
                dock_socket.listen(5)
                while True:
                        client_socket = dock_socket.accept()
                        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        server_socket.connect((setting[1], 80))
                        threading.Thread(target=forward, args=(client_socket, server_socket)).start()
                        threading.Thread(target=forward, args=(server_socket, client_socket)).start()
        finally:
                if settings[0][5]<=0:
                        weight_list = list()
                        for line in open(setup):
                                parts = line.split()
                                weight_list.append([int(parts[0]), parts[1], int(parts[2]), int(parts[3]), int(parts[4]), int(parts[5])])
                        settings = weight_list
                        for i in range(len(settings)):
                                minus_list.append(settings[i][5])
                        minus = gcd(minus_list)
                settings.sort(key=itemgetter(5), reverse=True)
                setting = tuple(settings[0])
                settings[0][5] = settings[0][5]-minus
                threading.Thread(target=server, args=(settings, setup, minus, setting)).start()
 
def forward(source, destination):
        string = ''
        print('work')
        while string:
                string = source.recv(4096)
                if string:
                        destination.sendall(string)
                else:
                        source.shutdown(socket.SHUT_RD)
                        destination.shutdown(socket.SHUT_WR)
 
if __name__ == '__main__':
        main('round-robin.conf', 'error.log')
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.05.2017, 17:32
Ответы с готовыми решениями:

Разделить ip от port'a
У меня есть функция &quot;JoinRoom&quot;, в которой есть цикл &quot;for&quot;. Он должен разделить &quot;ip&quot; от &quot;port'а&quot;. Оно работает так, если индекс...

Перевод bytes из Serial port в числа
Добрый день! Подключил модуль лазерного датчика к компьютеру. На выходе получаю с него данные в виде bytes: b'\xa3' b'\xaf' ...

Реализация корректного чтения данных из com-port
Необходимо читать данные из СОМ-порта. Реализовал. Даю команду МК оцифровывать данные и высылать в течение заданного времени. И...

4
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.05.2017, 16:23
Python
1
2
3
4
5
6
7
def forward(socket_source, socket_destination):
    while True:
        data = socket_source.recv(4096)
        if data:
            socket_destination.sendall(data)
    # socket_source.shutdown(socket.SHUT_RD)
    # socket_destination.shutdown(socket.SHUT_WR)
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 3
26.05.2017, 07:37  [ТС]
К сожалению с такими изменениями такой же результат. При попытке присоединиться браузером идёт загрузка страницы, и на ней останавливается.
0
17 / 17 / 11
Регистрация: 17.03.2017
Сообщений: 109
28.05.2017, 23:13
если я правильно понял, и все дело в перенаправлении данных, то
Python
1
2
3
4
while True:
    data,addr = socket_source.recvfrom(4096)
    if data and addr:
        socket_destination.sendto(data,addr)
или recvfrom только с UDP работает ?
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 3
29.05.2017, 01:16  [ТС]
socket.sendto: Send data to the socket. The socket should not be connected to a remote socket, since the destination socket is specified by address.

Иными словами, он заменяет server_socket.connect((setting[1], 80))
Но это одноразовая передача, которая будет создавать соединение при каждом проходе цикла, а нужно на одном соединении несколько передач, пока не закроется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2017, 01:16
Помогаю со студенческими работами здесь

SSH Dynamic Port Forwarding средствами Python
Доброго дня всем. Есть задача поднять несколько десятков socks на локалке через ssh -D, paramiko подобное не умеет к сожалению, есть...

Работа с UDP протоколом за роутером (Port Restricted Cone NAT и в добавок Random port )
Посылая сообщение на внешний ip Nat роутера меняет порт.... и при попытки отправить ответ и указывая либо старый либо новый порт с ip...

Работа Scilab Serial Port Library (COM port)
Как работает Scilab Serial Port Library ? (может кто то встречал описание подробное, поделитесь ссылкой) Нужно получать с COM port...

Simulink-serial port-arduino-serial port-Simulink
Здравствуйте! Мне нужно передать звук с одного компьютера на другой. Я собрал такую схему, где используется передатчик и приёмник. Я...

Com PORT
Над своим вопросом безуспешно бился 3 дня, испытаю судьбу здесь. В общем, я написал программу для консоли, которая будет принимать данные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru