Собственно это мой первый опыт написания сетевого кода и проблема с которой я сталкнулся поставила меня в тупик.
Сервер:
static void Main(string[] args)
{
...
cO.Out("SERVER MyServer [v0.1]: active.");
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
UdpClient newsock = new UdpClient(ipep);
cO.Out("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
data = newsock.Receive(ref sender);
cO.Out("Message received from: " + sender.ToString());
cO.Out(Encoding.ASCII.GetString(data, 0, data.Length));
// Ответ клиенту.
string welcome = "Welcome on Server: MyServer [v0.1].";
data = Encoding.ASCII.GetBytes(welcome);
newsock.Send(data, data.Length, sender);
// Прием сообщенрия от клиента
data = newsock.Receive(ref sender);
int test = BitConverter.ToInt32(data, 0);
cO.Out("Client 1: " + test.ToString());
newsock.Close();
cO.Out("Stopping server.");
Console.ReadLine();
}
Клиент:
...
public class cForm1 : System.Windows.Forms.Form
{
private UdpClient server = new UdpClient("127.0.0.1", 9050);
private IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
...
// Обработчик нажатия кнопки Connect
private void button1_Click(object sender, System.EventArgs e)
{
// Сообщение серверу: "Client 1 has connected."
string welcome = "Client 1 has connected.";
data = Encoding.ASCII.GetBytes(welcome);
server.Send(data, data.Length);
// Получения сообщения от сервера и вывод в консоль
data = new byte[1024];
data = server.Receive(ref this.sender);
cO.Out("Message received from: " + this.sender.ToString());
cO.Out(Encoding.ASCII.GetString(data, 0, data.Length));
}
// Обработчик нажатия кнопки Send
private void button2_Click(object sender, System.EventArgs e)
{
// Отправка на сервер содержимого textBox1
data = BitConverter.GetBytes(Convert.ToInt32(this.textBox1.Text));
server.Send(data, data.Length);
cO.Out("Stopping client");
server.Close();
}
}
В данном случае все работает как часы.
Но стоит изменить в клиенте private UdpClient server = new UdpClient("127.0.0.1", 9050);
на private UdpClient server = new UdpClient();
и в обработчик кн. Connect добавить
try
{
server.Connect("Допустим_мой_IP_адрес", 9050);
...
}
catch (Exception a)
{
cO.Out(a.ToString());
}
при попытке присоедениться к серверу получаю следущее:
[13:6:20] System.Net.Sockets.SocketException: Удаленный хост принудительно разорвал существующее подключение
at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP)
at System.Net.Sockets.UdpClient.Receive(IPEndPoint& remoteEP)
at Client.cForm1.button1_Click(Object sender, EventArgs e) in c:\...\...\...\visual studio projects\...\client v0.1\cform1.cs:line 123
Примечания:
1)Вместо "..." указан путь до проэкта.
2)line 123 : data = server.Receive(ref this.sender);
3)cO.Out() <- Функция мною созданного класса, изпользую для логирования консоли.
Вопрос: почему при подключении через лок. хост все работает, а при указании внешнего IP нет?
Заранее благодарен за любую помощь.
server.Connect("Допустим_мой_IP_адрес", 9050);
А ты sender"у IP прописал или так IPAddress.Any и остался?
И вообще — зачем ты два сокета создаёшь, а не через один и тот же не передаёшь/принимаешь?
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
нет, в данном примере так и оставил Any...
в данный момент проблему решил, тема закрыта.