Verbindung SOCKET klappt net....
-
Hi Leutz!!
Ich machte alles nach Tutorial von www.mut.de
Mein Programm SOCK.EXE führte ich 2mal aus, steht da, dann sollte man verbinden können. Macht alles ja, nur eine verbindung kriegt der nich zu stande!Hier der Code für die Klasse "CMySocket":
// MySocket.cpp: Implementierungsdatei // #include "stdafx.h" #include "Sock.h" #include "MySocket.h" #include "SockDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMySocket CMySocket::CMySocket() { } CMySocket::~CMySocket() { } //Die folgenden Zeilen nicht bearbeiten. Sie werden vom Klassen-Assistenten benötigt. #if 0 BEGIN_MESSAGE_MAP(CMySocket, CAsyncSocket) //{{AFX_MSG_MAP(CMySocket) //}}AFX_MSG_MAP END_MESSAGE_MAP() #endif // 0 ///////////////////////////////////////////////////////////////////////////// // Member-Funktion CMySocket void CMySocket::SetParent(CDialog *pWnd) { m_pWnd = pWnd; } void CMySocket::OnAccept(int nErrorCode) { if (nErrorCode == 0) ((CSockDlg*)m_pWnd)->OnAccept; } void CMySocket::OnConnect() { } void CMySocket::OnClose() { } void CMySocket::OnReceive() { } void CMySocket::OnSend() { }Und noch der Code von "CSockDlg": (Nur in diesen 2 musste ich sachen machen! Beim kompilieren 0 Fehler, 0 Warnungen...)
[cpp]
// SockDlg.cpp : Implementierungsdatei
//#include "stdafx.h"
#include "Sock.h"
#include "SockDlg.h"#ifdef DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE_;
#endif/////////////////////////////////////////////////////////////////////////////
// CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"class CAboutDlg : public CDialog
{
public:
CAboutDlg();// Dialogfelddaten
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
//}}AFX_VIRTUAL// Implementierung
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// Keine Nachrichten-Handler
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CSockDlg DialogfeldCSockDlg::CSockDlg(CWnd* pParent /=NULL/)
: CDialog(CSockDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSockDlg)
m_strMessage = _T("");
m_strName = _T("");
m_iPort = 0;
m_iType = -1;
//}}AFX_DATA_INIT
// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CSockDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSockDlg)
DDX_Control(pDX, IDC_LSENT, m_ctlSent);
DDX_Control(pDX, IDC_LRECVD, m_ctlRecvd);
DDX_Control(pDX, IDC_BCONNECT, m_ctlConnect);
DDX_Text(pDX, IDC_EMSG, m_strMessage);
DDX_Text(pDX, IDC_ESERVERNAME, m_strName);
DDX_Text(pDX, IDC_ESERVPORT, m_iPort);
DDX_Radio(pDX, IDC_RCLIENT, m_iType);
//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CSockDlg, CDialog)
//{{AFX_MSG_MAP(CSockDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_RCLIENT, OnRType)
ON_BN_CLICKED(IDC_RSERVER, OnRType)
ON_BN_CLICKED(IDC_BCONNECT, OnBconnect)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CSockDlg Nachrichten-HandlerBOOL CSockDlg::OnInitDialog()
{
CDialog::OnInitDialog();// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
// wenn das Hauptfenster der Anwendung kein Dialogfeld ist
SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
m_iType=0;
m_strName="loopback";
m_iPort=4000;
UpdateData(FALSE);
m_sConnectSocket.SetParent(this);
m_sListenSocket.SetParent(this);return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
}void CSockDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}// Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie
// den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das
// Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.void CSockDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // Gerätekontext für ZeichnenSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Symbol in Client-Rechteck zentrieren
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;// Symbol zeichnen
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}// Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
// das zum Symbol verkleinerte Fenster mit der Maus zieht.
HCURSOR CSockDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}void CSockDlg::OnRType()
{
// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
UpdateData(TRUE);
if(m_iType == 0)
m_ctlConnect.SetWindowText("&Verbinden");
else
m_ctlConnect.SetWindowText("&Hören");
}//DEL void CSockDlg::OnAccept(int nErrorCode)
//DEL {
//DEL
//DEL }void CSockDlg::OnBconnect()
{
// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
UpdateData(TRUE);
GetDlgItem(IDC_BCONNECT)->EnableWindow(FALSE);
GetDlgItem(IDC_ESERVERNAME)->EnableWindow(FALSE);
GetDlgItem(IDC_ESERVPORT)->EnableWindow(FALSE);
GetDlgItem(IDC_STATICNAME)->EnableWindow(FALSE);
GetDlgItem(IDC_STATICPORT)->EnableWindow(FALSE);
GetDlgItem(IDC_RCLIENT)->EnableWindow(FALSE);
GetDlgItem(IDC_RSERVER)->EnableWindow(FALSE);
GetDlgItem(IDC_STATICTYPE)->EnableWindow(FALSE);
//Läuft Anwendung aus Client oder Server?
if (m_iType == 0)
{
//Client, einen **StandardSocket erzeugen
m_sConnectSocket.Create();
//Verbindung zum Server öffnen
m_sConnectSocket.Connect(m_strName, m_iPort);
}
else
{
//Server, einen Socket für den angegeben Anschluss erzeugen
m_sListenSocket.Create(m_iPort);
//Auf Verbindungsgesuche hören
m_sListenSocket.Listen();
}
}void CSockDlg::OnAccept()
{
m_sListenSocket.Accept(m_sConnectSocket);
GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
}void CSockDlg::OnConnect()
{
GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
}void CSockDlg::OnSend()
{}
void CSockDlg::OnReceive()
{}
void CSockDlg::OnClose()
{}
[/cpp]**
-
nabend,
sieht eigentlich richtig aus. woher weisst du, dass keine verbindung zustande kommt?
-
Original erstellt von Lightbringer:
**nabend,sieht eigentlich richtig aus. woher weisst du, dass keine verbindung zustande kommt?**
wenn eine Verbindung besteht werden Steuerelemente aktiviert bzw. deaktiviert! Daran sieht man das eigentlich nur...
Aber das Tutorial - jedenfalls das kapitel - ist fehlerfrei, da wirst du dich wohl irgendwo vertippt haben.

-
Hmmm... Ja, könnte durchaus möglich sein.
Danke trozdem!
Ich werde es nochmals von vorn versuchen
-
Hi,
ist das wirklich fehlerfrei ?
Ich dachte da sind 2 Fehler drin ?
Hab das Buch jetzt leider nicht hier, aber ich glaube
bei den Bezeichnungen für den Server hat sich der Fehlerteufel
eingeschlichen.Gruß Chris
-
Ich habe das "Tutorial" ebenfalls mühevoll abgetippt und hab leider das selbe Problem. Hat vielleicht jemand das Buch C++ in 21 Tagen und könnte mal das entsprechende Listing also den Original MUT Quellcode Posten.
Es geht um Kapitel 20:
http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap20.htm-danke im Vorraus-
hever
-
Hi!
Da ich mich reinzufällig auch gerade mit Sockets beschäftige, habe ich gestern auch das tutorial gemacht. Ich glaube ich weiß wo das Problem deines Programmes ist, und zwar hier:void CMySocket::OnAccept(int nErrorCode) { if (nErrorCode == 0) ((CSockDlg*)m_pWnd)->OnAccept; <--- }Man sieht es nicht auf den ersten blick, aber du hast hinter dem OnAccept die beiden Klammern vergessen, sollte also so aussehen:
void CMySocket::OnAccept(int nErrorCode) { if (nErrorCode == 0) ((CSockDlg*)m_pWnd)->OnAccept(); <--- }Mir ist es schon öfter Passiert das wegen den dämlichen void klammern etwas nicht funktioniert hat. Das blöde ist ja, dass der Compiler manchmal keine Fehlermeldung, geschweige denn warnung ausgibt... Probier einfach mal aus ob es jetzt klappt.
Perner
-
Bei mir waren diese Klammern gesetzt, also naja funzt halt immer noch nicht

Könnte es irgendwie daran liegen, dass die messages OnXXX nicht richtig übermittelt werden ?