Порты сокета C # сервера - PullRequest
       14

Порты сокета C # сервера

2 голосов
/ 07 октября 2009

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

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

сервер инициализируется так:

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

(b - мой локальный ip)

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

сейчас на клиенте у меня:

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

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

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

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

Хорошо, после этого я создал на сервере еще один сокет-сервер, связанный с портом 1001:

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

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

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

Есть идеи, почему это происходит и как это исправить? Спасибо заранее.

Ответы [ 2 ]

3 голосов
/ 07 октября 2009

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

1 голос
/ 07 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...