methode die socket verbindet?



  • ich hab testweise mal ne klasse gebastelt:

    class MakeSockets
    	{
    	private:
    		int status;
    		SOCKET s;
    		SOCKADDR_IN addr;
    		long rc;
    	public:
    		MakeSockets()
    		{
    			status = 0;
    		}
    		void ConnectSock(char *IPAdresse)
    		{
    			rc=startWinsock();
    			// Winsock starten
    			if(rc!=0)
    			{
    				//FEHLER! code in rc drin...
    			}
    			else
    			{
    				//OK
    			}
    			// Socket erstellen
    			s=socket(AF_INET,SOCK_STREAM,0);
    			if(s==INVALID_SOCKET)
    			{
    				closesocket(s);
    			}
    			else
    			{
    				//socket erstellt
    			}
    			memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
    			addr.sin_family=AF_INET;
    			addr.sin_port=htons(12345); // wir verwenden mal port 12345
    			addr.sin_addr.s_addr=inet_addr(IPAdresse); // zielrechner ist unser eigener
    			rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    			if(rc==SOCKET_ERROR)
    			{
    				//Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()
    				closesocket(s);
    				status = 2;
    			}
    			else
    			{
    				//Verbunden mit 127.0.0.1..
    				status = 1;
    			}
    		}
    		int GiveStatus()
    		{
    			return status;
    		}
    		void sendData(char *strToSend)
    		{
    			rc=send(s,strToSend,strlen(strToSend),0);
    		}
    	};
    

    nur leider funtz das senden nur wenn ichs innerhalb der methode connectsock tue oO senddata funzt nicht als eigene methode! die sockets sind aber doch nich lokal definiert und müssten überall verfügbar sein oder?



  • Hallo,

    dir ist aber schon klar, daß:

    1. "funzt nicht" eine der schlechtesten Fehlerbeschreibungen ist, die man in einem Forum geben kann. Da fragst du schon den Rückgabewert (rc) ab, und läßt uns trotzdem im Unklaren, was rc beinhaltet (und ein eventuell folgendes WSAGetLastError im Fehlerfalle wäre auch noch hilfreich)

    2. sizeof dir in den wenigsten Fällen (um noch zu untertreiben) die richtige Länge der zu versendenden Daten (strToSend) zurückgibt, sizeof auf einen Zeiger (strToSend) gibt immer den selben Wert zurück, egal, wieviele Zeichen die Folge umfaßt, auf die strToSend zeigt.

    Vielleicht das als erste Ratschläge, vielleicht kann jemand noch die Liste oben ergänzen, ich habe beim ersten Hinsehen nichts anderes gefunden.

    MfG



  • oO wieso hab ich da sizeof...hm müsste doch strlen sein...änder ich mal schnell...das mit rc guck ich ma nach...
    rc = -1
    lastError= An operation was attempted on something that is not a socket. ( 10038 )
    oO wieso not a socket?



  • wie sieht dein Aufrufversuch (mit Erstellung des MakeSockets-Objekts und der folgenden Methodenaufrufe) aus? Hast du vor dem Aufruf von sendData mit ConnectSock eine Verbindung hergestellt?

    MfG



  • klaro

    LRESULT CALLBACK MakeProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    	{
    		MakeSockets Sock;
    		switch (message) 
    		{
    			case WM_INITDIALOG:
    				ShowWindow(hwnd, SW_SHOWNORMAL);
    				return TRUE;
    			case WM_COMMAND: 
                	if(LOWORD(wParam) == IDOK)
    				{	
    					char *ip = new char[GetEditTextLength(GetDlgItem(hwnd,IDC_IPADDRESS))];
    					ip = WindowText(GetDlgItem(hwnd,IDC_IPADDRESS));
    					Sock.ConnectSock(ip);
    					if(Sock.GiveStatus() == 1)
    					{
    						MessageBox(hwnd,CombinChars("Konnte zu ",CombinChars(ip," verbinden")),"",0);
    					}
    					else if(Sock.GiveStatus() == 2)
    					{
    						MessageBox(hwnd,CombinChars("Konnte nicht zu ",CombinChars(ip," verbinden")),"",0);
    					}
    				}
    				if(LOWORD(wParam) == ID_SEND)
    				{
    				/*	char *buf = new char[GetEditTextLength(GetDlgItem(hwnd,IDC_TOSEND))];
    					buf = WindowText(GetDlgItem(hwnd,IDC_TOSEND));
    					Sock.sendData(buf);
    					SetWindowText(GetDlgItem(hwnd,IDC_SHOW),buf);
    					*/
    					Sock.sendData("blablub");
    				}
    				return TRUE;
    			case WM_CLOSE:
    				EndDialog(hwnd,0);
    		}  
    		return FALSE;
    	}
    

    erst klick ich auf verbinden(IDOK) und krieg ne msg(konnte zu blabla verbinden...)
    dann auf senden(ID_SEND)



  • da haben wir doch schon das Problem, manchmal muß man wirklich erst den entscheidenden Code-Teil sehen, um einen Fehler ausmachen zu können:

    du erstellst mit jedem Aufruf der MakeProc einen neuen Socket (ein neues MakeSockets-Objekt), der erste wird sogar beim WM_INITDIALOG erzeugt, der zweite bei der Verarbeitung von WM_COMMAND-Nachrichten usw...d.h., jede Nachrichtenbehandlung in der MakeProc führt zu einem neuen MakeSockets-Objekt, und damit greift die Behandlung von ID_SEND zwar auf ein MakeSockets-Objekt zu, für das aber kein Connect aufgerufen wurde (->...is not a socket, der Connect wurde nur für das Objekt aufgerufen, das bei der Verarbeitung von IDOK erzeugt wurde). Eine Lösung: du kannst ein globales MakeSockets-Objekt erzeugen, und dieses wird dann in der MakeProc verwendet, und dann funktioniert das auch mit dem Senden.

    MfG



  • OO du hast recht! man bin ich blöd 😃
    dankeee 🙂
    wie mache ich nen prototyp vonna class?



  • ... oder einfach static machen 😉


Anmelden zum Antworten