2009-10-07 3 views
2

Эй, поэтому я пытаюсь создать простую игру с использованием сокетов (не tcpclient или tcplistener, и да, я знаю, что они одно и то же). Мне удалось заставить чат работать, и теперь я пытаюсь заставить игру работать. Я где-то читал, что лучший способ управлять игровыми данными - через другой порт на сервере (если кто-то может предложить лучший способ, не стесняйтесь это делать).C# Socket server Порты

Я собираюсь быть максимально простым, поэтому отправлю некоторые фрагменты кода, чтобы вы могли получить общую идею. (Кстати, я не ас # гуру, это мой первый проект гнездо поэтому, пожалуйста, понять мой newbiness)

сервер инициализируется следующим образом:

sv = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
ip = new IPEndPoint(IPAddress.Parse(b.ToString()), 1000); 
sv.Bind(ip); 

(б мой локальный IP)

сообщения отправляются с использованием sv.SendTo();

теперь на клиенте у меня есть:

svIp = new IPEndPoint(IPAddress.Parse(txtIp.Text.Trim()), 1000); 

и поток, который прослушивает входящие данные (смт как это):

rcv = sv.ReceiveFrom(data, ref svIp); 

Из моего понимания, клиент прослушивает все, что сервер отправляет его с порта 1000. Надеюсь, я до сих пор прав, потому что так работает клиент чата.

Ok, после этого, я создал на сервере другой сокет-сервер, который привязываться к порту 1001:

gameIp = new IPEndPoint(IPAddress.Parse(b.ToString()), 1001); 

теперь я хочу, чтобы отправить сообщение с нового сервера сокета, давайте назовем его gameSv, так Я отправляю сообщение клиенту с помощью gameSv.SendTo(); который должен, исходя из того, что я понимаю, отправить сообщение из порта 1001, которое клиент не может получить, потому что он только слушает данные, поступающие с порта 1000.

Хорошо, пока (надеюсь) после этого я создаю другой поток, который прослушивает данные, поступающие с сервера на порт 1001. Теперь, когда я отправляю сообщение из порта 1001, поток, прослушивающий порт 1000, получает его, чем если я отправляю другое сообщение, то другой поток, прослушивающий порт 1001 получает его, а другой нет, и так далее, он переходит от одного к другому.

Любая идея, почему это происходит и как ее исправить? Thx заранее.

+1

Почему вы не используете WCF? – Will

+0

Tbh Я не знал, что такое WCF, я искал google, кажется интересным, но у меня нет знаний, чтобы использовать его еще. Думаю, я больше читаю. В любом случае, я советую вам заглянуть в нее. – Bogdan

ответ

3

Похоже, вы путаете свои порты. Порт, который вы используете для отправки сообщения, не имеет значения. Второй параметр: SendTo определяет, к какому порту отправляется сообщение. Это должно соответствовать порту, который клиент прослушивает.

+0

Спасибо за ваш ответ. Теперь я понимаю, где я ошибся. – Bogdan

1

Socket может получать сообщения, предназначенные только для порта, к которому привязан сокет. Чтобы сделать это с помощью метода Bind().

IPEndPoint, который вы передаете в ReceiveFrom(), предназначен только для сохранения удаленного адреса, с которого было получено сообщение. Это не не для фильтрации, из которого порты/адреса для приема данных.

+0

Спасибо, я думаю, я слишком устал, чтобы думать прямо, я как-то знал, что ReceiveFrom использует этот EndPoint для хранения удаленного адреса, но я забыл. В любом случае, спасибо, что напомнили мне, что :) – Bogdan