(MFC mit dem...) Socket Problem
-
Tach leutz!
Habe eine Win Anwendung geschrieben. Soll ein Chat über Sockets werden.
Ganze einfache Server-Client Verbindung! Aber irgendwie kommt der Text immer nicht bei den anderen an! Hier der Hautpcode:void CChatDlg::OnRType() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen // Steuerelemente mit Variablen synchronisieren UpdateData(TRUE); // Welcher Modus ist eingestellt? if (m_iType == 0) // Entsprechenden Text auf der Schaltfläche festlegen m_ctlConnect.SetWindowText("&Verbinden"); else m_ctlConnect.SetWindowText("&Hören"); } void CChatDlg::OnBconnect() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen // Variablen mit Steuerelementen synchronisieren UpdateData(TRUE); // Steuerelemente für Verbindung und Typ deaktivieren GetDlgItem(IDC_BCONNECT)->EnableWindow(FALSE); GetDlgItem(IDC_ESERVERNAME)->EnableWindow(FALSE); GetDlgItem(IDC_ESERVERPORT)->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); GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE); GetDlgItem(IDC_EMSG)->EnableWindow(TRUE); GetDlgItem(IDC_BSEND)->EnableWindow(TRUE); GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE); // Läuft Anwendung als Client oder Server? if (m_iType == 0) { // Client, einen Standard-Socket erzeugen m_sConnectSocket.Create(); // Verbindung zum Server öffnen m_sConnectSocket.Connect(m_strName, m_iPort); } else { // Server, einen Socket für den angegebenen Anschluß erzeugen m_sListenSocket.Create(m_iPort); // Auf Verbindungsgesuche hören m_sListenSocket.Listen(); } } void CChatDlg::OnAccept() { // Verbindungsanforderung annehmen m_sListenSocket.Accept(m_sConnectSocket); // Steuerelemente für Text und Nachrichten aktivieren GetDlgItem(IDC_EMSG)->EnableWindow(TRUE); GetDlgItem(IDC_BSEND)->EnableWindow(TRUE); GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE); } void CChatDlg::OnConnect() { // Steuerelemente für Text und Nachrichten aktivieren GetDlgItem(IDC_EMSG)->EnableWindow(TRUE); GetDlgItem(IDC_BSEND)->EnableWindow(TRUE); GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE); GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE); } void CChatDlg::OnReceive() { char *pBuf = new char[1025]; int iBufSize = 1024; int iRcvd; CString strRecvd; // Nachricht empfangen iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize); // Wurde etwas empfangen? if (iRcvd == SOCKET_ERROR) { } else { // Ende der Nachricht abschneiden pBuf[iRcvd] = NULL; // Nachricht in einen CString kopieren strRecvd = pBuf; // Nachricht in Listenfeld der empfangenen Nachrichten eintragen m_ctlRecvd.AddString(strRecvd); // Variablen mit den Steuerelementen synchronisieren UpdateData(FALSE); } } void CChatDlg::OnClose() { // Den verbundenen Socket schließen m_sConnectSocket.Close(); // Steuerelemente zum Senden von Nachrichten deaktivieren GetDlgItem(IDC_EMSG)->EnableWindow(FALSE); GetDlgItem(IDC_BSEND)->EnableWindow(FALSE); GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE); GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE); // Läuft Anwendung im Client-Modus? if (m_iType == 0) { // Ja, Steuerelemente zum Konfigurieren der Verbindung aktivieren GetDlgItem(IDC_BCONNECT)->EnableWindow(TRUE); GetDlgItem(IDC_ESERVERNAME)->EnableWindow(TRUE); GetDlgItem(IDC_ESERVERPORT)->EnableWindow(TRUE); GetDlgItem(IDC_STATICNAME)->EnableWindow(TRUE); GetDlgItem(IDC_STATICPORT)->EnableWindow(TRUE); GetDlgItem(IDC_RCLIENT)->EnableWindow(TRUE); GetDlgItem(IDC_RSERVER)->EnableWindow(TRUE); GetDlgItem(IDC_STATICTYPE)->EnableWindow(TRUE); } } void CChatDlg::OnBsend() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen int iLen; int iSent; // Steuerelemente mit Variablen synchronisieren UpdateData(TRUE); // Zu sendende Nachricht vorhanden? if (m_strMessage != "") { // Länge der Nachricht ermitteln iLen = m_strMessage.GetLength(); // Nachricht senden iSent = m_sConnectSocket.Send(LPCTSTR(m_strMessage), iLen); // Konnte die Nachricht gesendet werden? if (iSent == SOCKET_ERROR) { MessageBox("Nachricht konnte nicht gesendet werden!","Fehler!"); } else { // Nachricht in Listenfeld hinzufügen. m_ctlSent.AddString(m_strMessage); // Variablen mit Steuerelementen synchronisieren UpdateData(FALSE); } } else { MessageBox("Gieb zuerst deine Nachricht ein!","Kein Text vorhanden!"); } } void CChatDlg::OnBclose() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen // OnClose-Funktion aufrufen OnClose(); }
Wisst ihr da weiter?
thanks,
wer
-
Gehört nach MFC, hat nix mit Standard-C++ zu tun.