Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2016 23:03:44

Megaman63
Зарегистрирован: 2016-05-10
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по socket

Столкнулся с такой проблемой. При домашнем сервере данный код отлично работает, сервер получает сообщения и на них отвечает. При удаленном сервере уже не работает. Сервер получает сообщения и отвечает, но до клиента они уже не доходят. Если отправлять сообщения не через сокет Игрока, а через тот же слушающий сокет (последнюю строчку меняем на UDPSock.sendto(w.data,p.addr)) - все получается на ура. в чем проблема, подскажите. И еще вопрос в догонку. Сколько сообщений в секунду может обработать сокет? имеет ли смысл слушать несколько портов (делать несколько входящих сокетов) или несколько исходящих сокетов? или все можно повесить на слушающий и отвечающий сокет? Кол-во сообщений ожидается большое - порядка 1000-5000 тысяч в секундну


UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

ip = ‘192.168.0.7’
port = 3030
listen_addr = (ip,port)
UDPSock.bind(listen_addr)

class Player:
def __init__(self, addr):
self.addr = addr
self.UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while 1:
data,addr = UDPSock.recvfrom(1024)

message = MessageReader(data)
messageId = message.readInt()


if messageId == 10:
arrayOfPlayers.append(Player(addr))
print('new player {}'.format(addr))
if messageId == 11:
text = message.readString()
num = message.readInt()

w = MessageWriter()
w.writeInt(11)
w.writeInt(1234567)
for p in arrayOfPlayers:
if p.addr == addr:
p.UDPSock.sendto(w.data,p.addr)

Офлайн

#2 Май 13, 2016 16:00:18

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Вопрос по socket

У вас, возможно, нат симметричный, ответ вы получите только с ip:port на который отправляли. В локалке, все будет ходит нормально.

Офлайн

#3 Май 13, 2016 16:46:50

Megaman63
Зарегистрирован: 2016-05-10
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по socket

noob_saibot
У вас, возможно, нат симметричный, ответ вы получите только с ip:port на который отправляли. В локалке, все будет ходит нормально.
а как можно узнать свой НАТ на домашнем компьютере? Я поставил переадресацию на роутере , чтобы внешние порты ссылались на нужный мне внутренний порт. У меня получалось ранее отправить пакеты со смартфона (3G), на домашний компьютер , я узнавал их внешние адресы , при помощи сервера со статическим IP , и все работало.

Офлайн

#4 Май 13, 2016 16:53:10

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Вопрос по socket

Megaman63
а как можно узнать свой НАТ на домашнем компьютере?
Запрос к stun серверу, он возвращает, тип ната, порт и ip.

Проверьте wireshark'ом, что все уходит с сервера.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version