[MFC] CSocket

Pagina: 1
Acties:

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Ik heb al ongelooflijk veel voorbeelden bekeken, maar kom nog geen steek verder. Zelfs mijn CSocket.Create() returned een FALSE :'( Moet je persé de class deriven om berichten te kunnen ontvangen (de OnReceive overloaden)?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Welkom in P&W -> Quickstart (update 2/10/2002)

Wat bedoel je precies?
Lees eens de quickstart (zie link), en vul je topic aan met de nodige informatie.

Misschien heb je hier wel wat aan.
en hier ook.

https://fgheysels.github.io/


Verwijderd

heb je ook naar non-MFC code voorbeelden gekeken? Je kunt in je MFC applicatie ook gewoon SOCKET's gebruiken. Daar zijn vast meer voorbeelden van te vinden.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Excuses voor mijn nogal beknopte post (zonder echte vraag). Wat ik wilde vragen: heeft iemand een idee waarom de Create van CSocket een FALSE returned? Op deze manier krijg ik natuurlijk nooit een Socket open.
Ik heb gewoon in mijn CDialog class een instantie van een CSocket, en probeer deze in de constructor van de CDialog aan te maken door pSocket.Create() uit te voeren. Maar deze functie loopt dus al direct spaak en returned een FALSE.

En dan de tweede vraag: moet ik persé een eigen class (CMySocket) aanmaken die afgeleid is van CSocket en waarin ik de functie OnReceive overload? Of kan ik gewoon een instantie van CSocket aanmaken en extern controleren of er berichten binnengekomen zijn (van bovenaf -> z'n parent) en dan deze berichten toevoegen op het scherm?
De meeste voorbeelden werken met tweezijdige referenties: de CDialog heeft een CSocket, en de CSocket heeft een pointer naar de CDialog. Hierdoor kan de CSocket zelf dingen toevoegen in de CDialog. Dit is alleen altijd nogal een gekunstel met #include's, omdat je op moet passen voor een wederzijdse include (waardoor de compiler oneindig gaat includen).

De oplossing die ik in m'n hoofd had was als volgt: de CSocket weet alleen dat er een CDialog boven hem zit (maar verder niks van extra functies), en stuurt vanuit de OnReceive een bericht middels SendMessage met de oproep: kijk ik heb een bericht voor je.
Maar ik kan dus niet testen of dit werkt, omdat ik de hele CSocket niet aan de praat krijg.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
heb de SOCKET al geprobeerd (ook werkend gekregen), maar vind het niet zo leuk om in een eigen thread hierop te moeten luisteren, terwijl de CSocket dat voor je doet. Wil gewoon graag ook de MFC methode onder de knie hebben :P

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

wat betreft die FALSE return bij Create, je moet eerst in de OnInitDialog functie de volgende functie aanroepen: AfxSocketInit( );
Daarna kun je CSocket::Create(..) functie aanroepen.

Wat beteft de tweede vraag: geen idee, ik gebruik geen CSocket, maar SOCKET (on MFC, maar werkt wel in MFC prg's).

[ Voor 2% gewijzigd door Verwijderd op 03-04-2003 15:36 . Reden: laat die laatste opmerking over SOCKET maar zitten, ik hadje laatste post nog niet gelezen) ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
JUIST! Bedankt man, nu returned ie in een keer wel TRUE :P
Vond het al zo vaag: het returnde een FALSE, maar GetLastError gaf wel een 0 terug...

SOCKET werkt inderdaad ook gewoon in MFC apps, maar ik wil gewoon kijken wat ik allemaal met CSocket kan :)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Ik heb een oplossing met CSocket die ikzelf wel geinig vind. Misschien is dat allang een keer uitgedacht, maar zelf ben ik 'm nog niet eerder tegengekomen. Graag feedback :P

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[CMySocket.h]
#include <afxwin.h>
#include <afxsock.h>

#define SOCKET_RECEIVE  5000

class CMySocket : public CSocket
{
private:
    CWnd * m_pParent;

public:
    CMySocket(CWnd * pParent);
    ~CMySocket();

protected:
    afx_msg void OnReceive(int nErrorCode);
};


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[CMySocket.cpp]
#include "CMySocket.h"

CMySocket::CMySocket(CWnd * pParent)
{
    m_pParent = pParent;
}

CMySocket::~CMySocket()
{
}

void CMySocket::OnReceive(int nErrorCode)
{
    CSocket::OnReceive(nErrorCode);
    m_pParent->SendMessage(SOCKET_RECEIVE);
}


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[MainGui.h]
#include <afxwin.h>
#include <afxcmn.h>
#include <afxsock.h>

#include "CMySocket.h"
class MainGui : public CDialog
{
private:
    CMySocket * m_pSocket;

public:
    MainGui();
    ~MainGui();

    enum{IDD = IDD_MAINGUI};

protected:
    DECLARE_MESSAGE_MAP();
};


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[MainGui.cpp]
#include "MainGui.h"

BEGIN_MESSAGE_MAP(MainGui, CDialog)
    ON_MESSAGE(SOCKET_RECEIVE, OnReceive)
END_MESSAGE_MAP()

MainGui::MainGui() : CDialog(MainGui::IDD, NULL)
{
    AfxSocketInit();
    m_pSocket = new CMySocket(this);

    m_pSocket->Create();
    m_pSocket->Connect("127.0.0.1", 80);
}

void MainGui::OnReceive(WPARAM wParam, LPARAM lParam)
{
    CString str;
    m_pSocket->Receive(str,10);
    AfxMessageBox(str);
}

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
misschien ff wat meer comment:

De CSocket zie ik als een onderliggend object van de CDialog.
Bij het aanmaken van de CMySocket geef ik een pointer naar de instantie van de CDialog mee (this).
Deze pointer gebruikt de CMySocket weer op zijn beurt om vanuit de OnReceive een SendMessage te doen naar zijn parent (de CDialog -> "hallo, ik heb een bericht in m'n buffer").
Deze message wordt (met behulp van de messagemap) doorgestuurd naar de functie die verantwoordelijk is voor binnenkomende berichten (de OnReceive van MainGui).

Hierdoor wordt een duidelijke structuur gewaarborgd waarbij de CDialog in de hiërarchie "boven" de CSocket blijft staan. Nu heb je dus geen moeilijkheden met wederzijdse includes e.d.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1