Как вид наблюдения для this question У меня есть решение, работающее на моей локальной машине, но не на машине в сети.Нужна помощь при обнаружении многоадресного udp-сервера в C#
Я не знаю слишком много о сокетах, кроме этих оснований, поэтому несите меня. Цель заключается в том, чтобы клиент мог искать сервер в локальной сети, и это результат некоторого кода cut/paste/edit.
Это код клиента:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
byte[] data = new byte[1024];
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
string welcome = "What's your IP?";
data = Encoding.ASCII.GetBytes(welcome);
client.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)server;
data = new byte[1024];
int recv = client.ReceiveFrom(data, ref tmpRemote);
this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
this.Port.Text = Encoding.ASCII.GetString(data, 0, recv); //set textbox
client.Close();
}
Это код сервера:
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10294);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any,IPAddress.Parse("127.0.0.1")));
while (true)
{
Console.WriteLine("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)(sender);
data = new byte[1024];
recv = newsock.ReceiveFrom(data, ref tmpRemote);
Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
string welcome = "7010";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote);
}
Он работает найти на моей локальной машине (клиент и сервер), но когда я пытаюсь другую машину в той же сети я получаю «существующее соединение было принудительно закрыто удаленным хостом»
Я понимаю, что мне нужно добавить много попыток/улов, но я просто пытаюсь получить представление о том, как это работает f рвые.
Да, оглядываясь на него после того, как вы упомянули, что имеет смысл, в то время (поскольку это в основном копируемый/вставленный код), я предположил, что это то, куда я отправляю, что, конечно, если я перестану думать об этом больше не имеет смысла указывать, откуда я отправляю. – Davy8 2008-10-19 04:34:39