recv bei WINAPI Anwendungen
-
Hi,ich hab ein Programm geschrieben,erst mal der ganze Source:
#include <windows.h> #include <string> using namespace std; /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); int startWinsock(void); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; HWND hEdit; HWND hEdit1; HWND hdit; HWND hCon; HINSTANCE hInstGlobal; long rc; SOCKET s; BOOL connected = FALSE; char buf[] = ""; char set_buf[] = ""; char ip_adresse[25]; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ hInstGlobal=hThisInstance; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Keylogger-Client by Xalon", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ 500, /* Windows decides the position */ 500, /* where the window ends up on the screen */ 530, /* The programs width */ 400, /* and height in pixels */ NULL, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, SW_SHOW); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ //aufraeumen closesocket(s); WSACleanup(); return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if (connected == TRUE) { rc=recv(s,buf,256,0); //vom server empfangen buf[rc]='\0'; //buf mit NULL Byte abschliesen //strcat(set_buf,buf); MessageBox(hwnd,buf,"Fehler!",MB_OK); //SendMessage (hdit, WM_SETTEXT,NULL,(LPARAM) set_buf); } switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; case WM_CREATE: HWND hButton; hdit = CreateWindow("EDIT","", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL, 10,10,500,300, hwnd,(HMENU) 1, hInstGlobal, NULL); hEdit = CreateWindow("EDIT","", WS_CHILD | WS_VISIBLE | WS_BORDER , 10,320,300,20, hwnd,(HMENU) 1, hInstGlobal, NULL); hCon = CreateWindow("BUTTON","Connect!", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 320,320,170,20, hwnd,(HMENU) 1, hInstGlobal, NULL); break; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { char *string1; string1 = new char[2048]; if (LOWORD(wParam) == 1) { SOCKADDR_IN addr; //Nimmt Daten fuer Socket auf rc=startWinsock(); //Winsock starten s=socket(AF_INET,SOCK_STREAM,0); //Den socket "starten" xD memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; //TCP addr.sin_port=htons(123); //Port 1234 verwenden SendMessage (hEdit, WM_GETTEXT, 1024,(LPARAM) ip_adresse); addr.sin_addr.s_addr=inet_addr(ip_adresse); //IP des Servers rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); //Socket verbinden if(rc==SOCKET_ERROR) { MessageBox(hwnd,"Konnte nicht verbinden...","Fehler!",MB_OK); } else { MessageBox(hwnd,"Verbunden mit Server!","Ok",MB_OK); connected = TRUE ; EnableWindow(hCon,FALSE); } } } break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } /* ################################################################### */ int startWinsock(void) /* WSDATA Struktur erstellen und Winsock starten */ { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } /* ################################################################### */Ich connecte zu einem Server,und empfange dann Daten vom server mit
if (connected == TRUE) { rc=recv(s,buf,256,0); //vom server empfangen buf[rc]='\0'; //buf mit NULL Byte abschliesen //strcat(set_buf,buf); MessageBox(hwnd,buf,"Fehler!",MB_OK); //SendMessage (hdit, WM_SETTEXT,NULL,(LPARAM) set_buf); }und zwar bei jedem Durchlauf der CALLBACK funktion.
Aber der Client hängt sich immer auf
Der Server sendet andauernd einzelne Buchstaben zum Client (ein Testserver
)
Weiß jamand warum und was ich dagegen machen kann?Danke im voraus,
ICZ
-
Erstell nen Thread für die Netzwerkkommunikation oder nutze WSAAsyncSelect.
-
.............. schrieb:
Erstell nen Thread für die Netzwerkkommunikation
richtich... denn wenn du funktionen innerhalb der wndproc aufrufst, die etwas länger brauchen, dann friert das window ein.

-
Ok danke euch

Jetzt hab ich aber noch ein Problem und zwar bei folgendem Code:while(rc!=SOCKET_ERROR) { rc=recv(s,buf,256,0); buf[rc]='\0'; strcat(set_buf,buf); SendMessage (hdit, WM_SETTEXT,NULL,(LPARAM) set_buf); }Ich lese ja immer einen buchstaben aus häng ihn dann an set_buf an und sende dann die SETTEXT Nachricht...
Aber es wird immer nur der als letztes ausgelesene buchstabe in hdit angezeigt
Überseh ich da was?
Schon mal dankeIcz
-
Icz schrieb:
while(rc!=SOCKET_ERROR) { rc=recv(s,buf,256,0); buf[rc]='\0'; strcat(set_buf,buf); SendMessage (hdit, WM_SETTEXT,NULL,(LPARAM) set_buf); }probier dies:
while(rc!=SOCKET_ERROR) { rc=recv(s,buf,256,0); buf[rc]='\0'; strcat(set_buf,buf); } SendMessage (hdit, WM_SETTEXT,NULL,(LPARAM) set_buf);
-
Hmm... das müsste wo wie net es geschrieben hat funzen, da du mit WM_SETTEXT bei einem EditCtrl den gesammten Text, der darin steht durch den den du im LPARAM übergibst ersetzt

-
@(D)Evil:
Ich weiß darum hab ichs ja auch mit strcat angehängt
@net:Der server sendet STÄNDIG Buchstaben,und die sollen sofort angehängt und ins editfeld gesetzt werden,niucht erst nach der Schleife.
Das sollte so doch eigentlich funktionieren o_ODanke im voraus
-
ICZ schrieb:
@net:Der server sendet STÄNDIG Buchstaben,und die sollen sofort angehängt und ins editfeld gesetzt werden,niucht erst nach der Schleife.
dann kannste mit GetWindowText() oder so erstmal alles aus dem editctrl rausholen, den neuen text anhängen und wieder zurückschreiben. ist aber nicht die beste lösung. es gibt da noch einen trick, cursor ans ende positionieren und dann mit EM_REPLACESEL neuen text anhängen.
-
wie man anhängt steht auf www.winapi.net
-
Machs doch so:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; bool appRunning = true; while (appRunning) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { /* Nachrichten empfangen... */ } } return 0; }