Hilfe bei Netzwerkprogrammierung



  • Hallo,

    ich brauche ein wenig Hilfe bei der Programmierung einer Datenübertragung über das Ethernet.

    Ich habe meinen Code unten gelistet, aber da funzt einiges noch nicht.
    Also der Code:

    void Send()
    {
        #define PORT=34000;
        AfxSocketInit(NULL);
        CSocket sockSrvr;
        sockSrvr.Create(PORT);
        sockSrvr.Listen();
        CSocket sockRecv;
        sockSrvr.Accept(sockRecv);
        CSocketFile myFile(&sockRecv);
        CArchive arOut(&myFile, CArchive::store);
        unsigned char buffer[10] = 
            {0x00,0xFF,0x10,0xEF,0x20,0xDF,0x30,0xCF,0x40,0xBF};
        CString str;
        arOut.Write(buffer,10);
        for (unsigned int iCount = 0; iCount < 10; iCount++)
        {
            str.Format("%02X", buffer[iCount]);
            m_cListSender.Addstring(str);
        }
        arOut.Close();
        sockRecv.Close();
        UpdateData(FALSE);
    }
    
    void Receive()
    {
        #define PORT 34000
        CSocket sockClient;
        sockClient.Create();
        sockClient.Connect("192.168.0.1", PORT);
        CSocketFile destFile(&sockClient);
        CArchive arIn(&destFile, CArchive::load);
        unsigned char buffer[10];
        unsigned int nr;
        CString str;
        nr = arIn.Read(buffer, 10);
        str.Format("%d",nr);
        m_cListReceiver.AddString(str);
        for (unsigned int iCount = 0; iCount < 10; iCount++)
        {
            str.Format("%02X", buffer[iCount]);
            m_cListReceiver.AddString(str);
        }
        arIn.Close();
        sockClient.Close();
        UpdataData(FALSE);
    }
    

    Meine Probleme sind nun:

    1. Ruft der Sender die Fkt. Send() auf, der Empänger aber nicht die Receive() Fkt., so hängt der Sender. Wie kann man das abfangen?
    2. Ruft der Empfänger die Fkt. Receive() auf, ohne dass vorher der Sender seine Send() Fkt. aufgerufen hat, so empfängt der Empfänger trotzdem; anscheinend irgendwelche Signalisierungsinformationen. Wie kann man dies untebinden, bzw. diese Bytes nicht in das Archiv einladen lassen?
    3. Ein nochmaliger Send-Empfang-Vorgang schlägt fehl, anscheinend sind irgendwelche Puffer o.ä. nicht zuückgesetzt. Was ist da evtl. schiefgegangen?
    4. Muss man bei der Wahl des PORTs irgendwas beachten?

    Es wäre nett, wenn mir jemand darauf Antworten bzw. Hinweise geben könnte. Bin in der Netzwerkprogrammierung noch sehr grün hinter den Ohren....

    Danke.
    Grüße, JohnTK



  • JohnTK schrieb:

    1. Ruft der Sender die Fkt. Send() auf, der Empänger aber nicht die Receive() Fkt., so hängt der Sender. Wie kann man das abfangen?

    der hängt bei 'accept' und wartet auf eine verbindung.

    JohnTK schrieb:

    1. Ruft der Empfänger die Fkt. Receive() auf, ohne dass vorher der Sender seine Send() Fkt. aufgerufen hat, so empfängt der Empfänger trotzdem; anscheinend irgendwelche Signalisierungsinformationen. Wie kann man dies untebinden, bzw. diese Bytes nicht in das Archiv einladen lassen?

    er empfängt nichts. 'connect' bricht ab, weil die verbindungsaufnahme erfolglos war und dein programm erzeugt dann müll. du solltest abfragen, ob eine verbindung überhaupt aufgebaut wurde.

    JohnTK schrieb:

    1. Muss man bei der Wahl des PORTs irgendwas beachten?

    die ersten 1024 sind reserviert.
    die anderen kann man frei benutzen, aber am besten erst oberhalb von 50000
    guckst du: http://www.iana.org/assignments/port-numbers



  • Okay danke erstmal.

    Zu 1) Wie kann man einen TIMEOUT erzeugen, dass das Accept nur eine bestimmte Zeit auf eine Verbindung wartet? Gibt es ein Rückgabewert, den man dazu auswerten kann?
    Zu 2) Wie kann ich überprüfen, ob eine Verbindung besteht?

    Die Klasse CSocket ist blockiernd, d.h. es macht Sinn den Netzwerkaufbau und -datenverkehr in einen Thread zu packen, oder? Das Programm soll kontinuierlich Daten über das Ethernet empfangen, und auf der Empfängerseite diese auch auswerten.
    Wie kann man es hinbekommen, dass man Daten bestimmter Menge empfängt, dann ein Ereignis auslöst, diese Daten in einem anderen Thread auswertet. Währenddessen soll der Empfangsthread aber weiter empfangen. Geht das? Und wie kann man es hinbekommen?

    Danke,
    Grüße,
    JohnTK


Anmelden zum Antworten