Avatar billede simon_jacobsen Nybegynder
23. juli 2008 - 13:05 Der er 2 kommentarer

UDP Client server hvor client bag NAT

Hej

Jeg sidder og roder med et simpelt UDP Netværks program, for at se om det kan lykkedes at lave 2 vejs kommunikation mellem en computer bag NAT og en server, men det volder lidt problemer selvom det skulle være lige til.
Hvad gør jeg forkert?
på begge computere trykker jeg på min Server knap for at vente på en pakke, men min "client" bag NAT kan jeg ikke få til at modtage, hvorimod "server" som ikke er bag NAT godt kan modtage, når "serveren" modtager for den også ip, og porten "1114", hvor porten variere lidt, men "serveren" skal vel sende sit svar til "source" porten.

min kode ser ud som følger:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace sender
{
    public partial class Form1 : Form
    {
        private UdpClient udpklient = new UdpClient();
        UdpClient server = new UdpClient(12345);

        public Form1()
        {
            InitializeComponent();
        }

        private void BtnServer_Click(object sender, EventArgs e)
        {
            //start server tråd
            Thread ServerTråd = new Thread(new ThreadStart(Serveren));
            ServerTråd.Start();
        }

        private void Serveren()
        {
            byte[] data;
            string str = "";
            IPEndPoint recvpt = new IPEndPoint(IPAddress.Any, 0);
            while (true)
            {
                data = server.Receive(ref recvpt);
                str = Encoding.ASCII.GetString(data);
                if (str == "hej")
                {
                    server.Send(data, data.Length, recvpt);   

                }             
                MessageBox.Show(str + " - ip : " + recvpt.Address.ToString() + " port : " + recvpt.Port.ToString());
            }
        }

        private void BtnSend_Click(object sender, EventArgs e)
        {
            Send(textBox1.Text, Txtip.Text, int.Parse(TxtPort.Text));
        }

        private void Send(string Besked, string Modtager, int port)
        {
            byte[] senddata = Encoding.ASCII.GetBytes(Besked);
            udpklient.Send(senddata, Besked.Length, Modtager, port);
        }

        private void Send(string Besked, IPEndPoint Modtager)
        {
            byte[] senddata = Encoding.ASCII.GetBytes(Besked);
            udpklient.Send(senddata, senddata.Length, Modtager);
        }

    }
}
Avatar billede bccinlove Nybegynder
23. juli 2008 - 21:27 #1
Din klient bag NAT bliver nødt til at sende en pakke først. Når klient der ikke er bag NAT modtager denne pakke, kan du læse hvor den kommer fra. Når klienten er bag NAT har den jo en anden port på ydersiden, end den du har bundet til. Denne yderside port kan du læse i IP pakken.
Avatar billede simon_jacobsen Nybegynder
23. juli 2008 - 22:28 #2
ja det mente jeg også, gør jeg ikke det med koden :
IPEndPoint recvpt = new IPEndPoint(IPAddress.Any, 0);
            while (true)
            {
                data = server.Receive(ref recvpt);
                str = Encoding.ASCII.GetString(data);
                if (str == "hej")
                {
                    server.Send(data, data.Length, recvpt); 

                }
hvis den den modtagende besked er "hej", hvilket den er, har testet at den komme ind i if-statementet, men modtager stadig ikke noget ved klienten hvilket undre mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester