Thread fürs listen bei Sockets



  • Hi Leutz,
    Ich versuche die listen-Funktion bei meinem Chat-Programm per Threads zu automatisieren. Allerdings klappt das nicht. Hier ist der Quelltext des bisherigen Programms:

    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #include <windowsx.h>
    #include <winsock2.h>
    #include <stdio.h>
    #include <process.h>
    
    #include "functions.h"
    
    #define THREADS
    
    HWND hName;
    HWND hIP;
    HWND hContent;
    HWND hMessage;
    HWND hConnect;
    HWND hWait;
    HWND hSend;
    
    HINSTANCE g_hInst;
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    DWORD WINAPI ServerListenThread (LPVOID data)
    {
    	ServerListen();
    	return ((DWORD)data);
    }
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, LPSTR szCmdLine, int iCmdShow)
    {
    	char MainWin[] = "Chat";
    	HBRUSH colour = CreateSolidBrush (RGB (58, 106, 157));
    
    	g_hInst = hI;
    	WNDCLASS wc;
    
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc = WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hI;
    	wc.hIcon = LoadIcon (NULL, IDI_WINLOGO);
    	wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    	wc.hbrBackground = colour;
    	wc.lpszMenuName = NULL;
    	wc.lpszClassName = MainWin;
    
    	RegisterClass (&wc);
    
    	HWND hMain = CreateWindow (MainWin, "Valet - Software Meadow", WS_OVERLAPPEDWINDOW, 300, 300, 500, 335, NULL, NULL, hI, NULL);
    	ShowWindow (hMain, iCmdShow);
    	UpdateWindow (hMain);
    
    	MSG msg;
    	while (GetMessage (&msg, NULL, 0, 0))
    	{
    		TranslateMessage (&msg);
    		DispatchMessage (&msg);
    	}
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc (HWND hMain, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HANDLE hThread[THREADS];
    	DWORD dwThreadID[THREADS];
    	char content[50000] = "";
    	char messages[99999] = "";
    	char sends[99999] = "";
    	char user[] = "";
    	static char getIP[30] = "";
    	static bool connect = false, server = false;
    
    	SOCKET send_recv;
    
    	PAINTSTRUCT ps;
    	HDC hDC;
    
    	switch (message)
    	{
    		case WM_CREATE:
    			hThread[0] = CreateThread (NULL, 0, ServerListenThread, (LPVOID)0, 0, &dwThreadID[0]);
    			WaitForMultipleObjects (THREADS, hThread, TRUE, INFINITE);
    			hName = CreateWindow ("Edit", NULL, WS_VISIBLE | WS_CHILD | WS_TABSTOP, 90, 10, 150, 16, hMain, (HMENU)0, g_hInst, NULL);
    			hIP = CreateWindow ("Edit", NULL, WS_VISIBLE | WS_CHILD | WS_TABSTOP, 330, 10, 150, 16, hMain, (HMENU)1, g_hInst, NULL);
    			hContent = CreateWindow ("Edit", NULL, WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_TABSTOP | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY, 10, 35, 470, 150, hMain, (HMENU)2, g_hInst, NULL);
    			hMessage = CreateWindow ("Edit", "abcdefghijklmnopqrstuvwxyz", WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_MULTILINE | ES_AUTOVSCROLL, 10, 210, 360, 80, hMain, (HMENU)3, g_hInst, NULL);
    			hConnect = CreateWindow ("Button", "Verbinden", WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_PUSHBUTTON, 380, 230, 100, 18, hMain, (HMENU)4, g_hInst, NULL);
    			hWait = CreateWindow ("Button", "Warten...", WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_PUSHBUTTON, 380, 210, 100, 18, hMain, (HMENU)5, g_hInst, NULL);
    			hSend = CreateWindow ("Button", "Absenden", WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_PUSHBUTTON, 380, 250, 100, 42, hMain, (HMENU)6, g_hInst, NULL);
    		return 0;
    
    		case WM_PAINT:
    			hDC = BeginPaint(hMain, &ps);
    			    SetBkMode (hDC, TRANSPARENT);
    				SetTextColor (hDC, RGB (255, 255, 255));
    				TextOut (hDC, 10, 10, "Dein Name:", strlen ("Dein Name:"));
    				TextOut (hDC, 250, 10, "IP-Adresse:", strlen ("IP-Adresse:"));
    				TextOut (hDC, 10, 190, "Dein Text:", strlen ("Dein Text:"));
                EndPaint (hMain, &ps);
    		return 0;
    
    		case WM_COMMAND:
    			//recv (send_recv, content, 5000, 0);
    			//SetWindowText (hContent, (LPCSTR)content);
    			switch (LOWORD (wParam))
    			{
    				case 4:
    					GetWindowText (hIP, getIP, 30);
    					connect = ClientConnect (getIP);
    					if (connect == false)
    					{
    						SetWindowText (hContent, (LPCSTR)"Konnte nicht mit der angegebenen IP verbinden.");
    					}
    					else {
    						SetWindowText (hContent, (LPCSTR)"Erfolgreich verbunden!");
    					}
    				break;
    
    				/*case 5:
    					connect = ServerListen ();
    					if (connect == true)
    					{
    						SetWindowText (hContent, (LPCSTR)"Erfolgreich verbunden!");
    						server = true;
    					}
    				break;*/
    
    				case 6:
    					if (connect == true)
    					{
    						GetWindowText (hName, user, 30);
    						GetWindowText (hMessage, content, 50000);
    						GetWindowText (hContent, messages, 99999);
    						if (sizeof (user) <= 1)
    						{
    							sprintf (sends, "%s\t\n<%s> %s", messages, getIP, content);
    						}
    						else {
    							sprintf (sends, "%s\n<%s> %s", messages, user, content);
    						}
    						send (send_recv, sends, 0, 0);
    						SetWindowText (hContent, (LPCSTR)sends);
    					}
    					else {
    						SetWindowText (hContent, (LPCSTR)"Keine aktive Verbindung verfügbar.");
    					}
    				break;
    			}
    		return 0;
    
    		case WM_DESTROY:
    			PostQuitMessage (0);
    			for (index=0; index<MAX_THREADS; index++)
    				CloseHandle(hThread[index]);
    		return 0;
    	}
    
    	return DefWindowProc (hMain, message, wParam, lParam);
    }
    

    Im Header functions sind nur die Funktionen zum Verbinden, und die listen-Funktion drin. Falls die auch benötigt wird, dann stelle ich die auch noch rein. Es wäre schön, wenn ihr mir entweder erklärt was ich genau machen muss, oder gleich den Quelltext modifiziert.

    Mfg Ominion

    PS: Ich benutze den Borland Compiler 5.5.1 (BCC 5.5.1).



  • *push*



  • Ominion|off schrieb:

    *push*

    Definiere "Funktioniert nicht"

    Dann wird dir vielleicht auch irgendjemand sagen woran es liegen könnte.
    🙂

    BR
    Vinzenz



  • Ominion schrieb:

    Ich versuche die listen-Funktion bei meinem Chat-Programm per Threads zu automatisieren.

    Das funktioniert nicht. Es lässt sich noch nicht kompilieren, um etwas genauer zu werden. Ich weiß nicht in wie fern noch weitere Informationen gebraucht werden, da für mich das Problem damit beschrieben wurde (kann aber natürlich auch daran liegen, dass ich das gesschrieben habe 😃 ). Ich würde eben gerne wissen wollen, wie ich das mit Threads machen muss/kann. Bisher hat das eben noch nicht funktioniert, was ich probiert habe.

    Mfg Ominion



  • Ominion schrieb:

    Es lässt sich noch nicht kompilieren, um etwas genauer zu werden.

    Und da fragst Du, welche Information fehlt? Oder gehst Du ernsthaft davon aus, dass jeder zuerst Dein Programm selbst kompiliert (sich selbstverständlich erstmal den BCC installiert) um herauszufinden wo welche Fehlermeldung auftaucht?



  • Ja, sry. Ich dachte, dass ich erwähnt habe, dass ich davon ausgehe, dass ich die Threads falsch benutze. Deshalb habe ich die Fehler auch weggelassen. Hier sind die Fehler und Warnungen:

    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    main1.cpp:
    Warning W8057 main1.cpp 63: Parameter 'hPrI' is never used in function __stdcall
     WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
    Warning W8057 main1.cpp 63: Parameter 'szCmdLine' is never used in function __st
    dcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
    Error E2449 main1.cpp 67: Size of 'hThread' is unknown or zero in function __std
    call WndProc(HWND__ *,unsigned int,unsigned int,long)
    Error E2449 main1.cpp 67: Size of 'hThread' is unknown or zero in function __std
    call WndProc(HWND__ *,unsigned int,unsigned int,long)
    Error E2449 main1.cpp 68: Size of 'dwThreadID' is unknown or zero in function __
    stdcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    Error E2449 main1.cpp 68: Size of 'dwThreadID' is unknown or zero in function __
    stdcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    Error E2188 main1.cpp 85: Expression syntax in function __stdcall WndProc(HWND__
     *,unsigned int,unsigned int,long)
    Warning W8008 main1.cpp 137: Condition is always true in function __stdcall WndP
    roc(HWND__ *,unsigned int,unsigned int,long)
    Warning W8066 main1.cpp 142: Unreachable code in function __stdcall WndProc(HWND
    __ *,unsigned int,unsigned int,long)
    Error E2451 main1.cpp 156: Undefined symbol 'index' in function __stdcall WndPro
    c(HWND__ *,unsigned int,unsigned int,long)
    Error E2451 main1.cpp 156: Undefined symbol 'MAX_THREADS' in function __stdcall
    WndProc(HWND__ *,unsigned int,unsigned int,long)
    Warning W8004 main1.cpp 162: 'server' is assigned a value that is never used in
    function __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    *** 7 errors in Compile ***
    

    Mfg Ominion



  • #define THREADS
    

    😡 🙄 🙄 🙄



  • Es kommen immernoch 4 Fehler:

    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    main1.cpp:
    Warning W8057 main1.cpp 64: Parameter 'hPrI' is never used in function __stdcall
     WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
    Warning W8057 main1.cpp 64: Parameter 'szCmdLine' is never used in function __st
    dcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
    Error E2453 main1.cpp 84: Size of the type 'void' is unknown or zero in function
     __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    Error E2109 main1.cpp 84: Not an allowed type in function __stdcall WndProc(HWND
    __ *,unsigned int,unsigned int,long)
    Error E2034 main1.cpp 85: Cannot convert 'void *' to 'void * const *' in functio
    n __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    Error E2342 main1.cpp 85: Type mismatch in parameter 'lpHandles' (wanted 'void *
     const *', got 'void *') in function __stdcall WndProc(HWND__ *,unsigned int,uns
    igned int,long)
    Warning W8008 main1.cpp 137: Condition is always true in function __stdcall WndP
    roc(HWND__ *,unsigned int,unsigned int,long)
    Warning W8066 main1.cpp 142: Unreachable code in function __stdcall WndProc(HWND
    __ *,unsigned int,unsigned int,long)
    Warning W8004 main1.cpp 162: 'server' is assigned a value that is never used in
    function __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    *** 4 errors in Compile ***
    

    Weiß jemand, ob beim kompilieren mit den BCC 5.5.1 irgendwelche Optionen für das Multithreading gebraucht werden?

    Mfg Ominion



  • Kannst du auch mal selbst nachdenken?



  • Die Fehler beziehen sich alle auf die Threads, so dass ich nicht weiß was ich verändern muss. Ich habe ja auch schon ein bisschen rumprobiert aber das sind eben die "Restfehler". Zeile 84 und 85 sind diese beiden Zeilen:

    hThread[0] = CreateThread (NULL, 0, ServerListenThread, (LPVOID)0, 0, &dwThreadID[0]);
                WaitForMultipleObjects (0, hThread, TRUE, INFINITE);
    

    Mit den anderen Fehlern würd ich mich dann weiter probieren.

    Mfg Ominion


Anmelden zum Antworten