• Welcome to Valhalla Legends Archive.
 

Need some help!

Started by Final, January 06, 2006, 05:57 PM

Previous topic - Next topic

Final

Well first of all im starting to learn winsock but I wanted to learn
Asynchronous Socket
Because I think its alot easier to handle clients information because it has its cases for client connect data recieved and data send.

But im having a problem because I dont know how it can be implanted into a program this is the code i wanted to implant but couldnt.


#define YOUR_SOCKET_MSG   WM_USER + 100      // WM_USER is a base value for user-defined messages

...

WSAAsyncSelect(theSocket, hwnd, YOUR_SOCKET_MSG, FD_READ | FD_WRITE | FD_CONNECT);.


//in window procedure:

switch (msg) {
   case YOUR_SOCKET_MSG:
      if (WSAGETSELECTERROR(lParam)) {      // If an error occurred,
         closesocket(theSocket);      // Close the socket
         WSACleanup();            // Shutdown Winsock
         return NETWORK_ERROR;         // Return NETWORK_ERROR, WSAGetLastError(), etc.
      }
      switch (WSAGETSELECTEVENT(lParam)) {   // Differentiate between the events
         case FD_READ:
       // Receive data
       break;
    case FD_WRITE:
       // Write data
       break;
         case FD_CONNECT:
       // Just connected to server
       break;
      }
      break;
}

How do I get that into a c++ program please if anyone can just make a working example of this would mke my day cuz  i looked into google as well and would give me the exact same stuff to put into a win32 api but dont know were to put it all please help!!

Kp

Quote from: Final on January 06, 2006, 05:57 PMHow do I get that into a c++ program please if anyone can just make a working example of this would mke my day cuz  i looked into google as well and would give me the exact same stuff to put into a win32 api but dont know were to put it all please help!!

Save the code in a file with the .cpp extension and add the resulting file to your compilation environment (Visual Studio or Dev-C++).
[19:20:23] (BotNet) <[vL]Kp> Any idiot can make a bot with CSB, and many do!

Final

#2
Ok Well I found a better tutorial on the same subject and I finally came out with this code using the tutorial code to instert into a simple win32 api project and this is what i came out with.

#include <windows.h>
#include <winsock.h>
// the message we'll use for our async notification
#define WM_WSAASYNC (WM_USER +5)


/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
int PASCAL FAR WSAAsyncSelect(SOCKET s,
                              HWND hwnd,
                              unsigned int wMsg,
                              long lEvent);
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

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 */

    /* 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 */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* 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, nFunsterStil);

    /* 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 */
    return messages.wParam;
}
// create and test the socket
//Port = socket(AF_INET, SOCK_STREAM, 0);

WSAAsyncSelect(htons(10), hwnd, WM_WSAASYNC, FD_READ | FD_WRITE |FD_ACCEPT | FD_CLOSE)
{
switch(msg)
{
case WM_WSAASYNC:
  {
    // what word?
    switch(WSAGETSELECTEVENT(lParam))
    {
case FD_READ:
{
     int bytes_recv = recv(wParam, &data, sizeof(data), 0);         
}break;
case FD_WRITE:
  {
     //Dont use this for send it wont work for our advantage we must use Send(); in the Read case to make
     //it work properly.
              // enter an infinite loop
    while(TRUE)
    {
      // read in more data from the file and store it in packet.data.
      in.read((char*)&packet.data, MAX_PACKET_SIZE);

      // increment the amount of data sent
      data_sent += strlen(packet.data);

      // send the packet off to the Server if it is filled
     
      if (send(wparam, (char*)(&packet), sizeof(PACKET), 0) == SOCKET_ERROR)
      {
        // check if the network buffer is full and can send no more
        // data. If so then break from the loop
        if (WSAGetLastError() == WSAEWOULDBLOCK)
        {
          // break from the loop - buffer is full
          break;
        }
        else // another error
        {
          // display an error message and clean up
          CleanUp();
          return(0);
        }
      }
    }
  } break;
case FD_ACCEPT:
  {
               // holds size of client struct
    int lenclient = sizeof(client_sock);
    // connect to the server
    Port = accept(wParam, &client_sock, &lenclient);
  } break;
case FD_CLOSE:
  {
  } break;
    }
  }
}
}
/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

But now Im getting an error around this part.

WSAAsyncSelect(htons(10), hwnd, WM_WSAASYNC, FD_READ | FD_WRITE |FD_ACCEPT | FD_CLOSE)

What am i doing wrong please help me the error message dosent really help its one of those error message that dosent give you a specific and just gives an error of missing a ; or before } i tried everything but no luck could someone help me out im despriate

Kp

Quote from: Final on January 06, 2006, 11:44 PMWhat am i doing wrong please help me the error message dosent really help its one of those error message that dosent give you a specific and just gives an error of missing a ; or before } i tried everything but no luck could someone help me out im despriate

Have you considered that you're just not ready to do this?  The error message told you exactly what was wrong!  You are missing a semicolon before the { right next to the WSAAsyncSelect.  Also, please start using code tags when you paste code.  If you're feeling really helpful, you should also turn on lexical highlighting.
[19:20:23] (BotNet) <[vL]Kp> Any idiot can make a bot with CSB, and many do!

Final

Ok guys after alot of hard work and determination I finally got it working damn was it hard i was messing alot of things i eventually found a game that had that type of socket programming I was trying to learn but when I went into the the folder i thought the client was the server and copyed the wrong code It didnt hit me until like 40 mins later that i was using the wrong one and went into the server thinking it was the same coding as the client as socket type then i opened it and saw it was BLOCKING SOCKETS wich ticked me off but then I thout it over after i thout i was defeated then thout wy not change the client into a server and that is exactly what i did and finally got that shis working now i am one happy teen lol thanks for all trying to help me out on this i really appreciate it.

Kp

Was there a point to that post?  Was there even a coherent thought in it?  I couldn't find one in that mess...
[19:20:23] (BotNet) <[vL]Kp> Any idiot can make a bot with CSB, and many do!

shout

Quote from: Kp on January 07, 2006, 11:22 AM
If you're feeling really helpful, you should also turn on lexical highlighting.

[OT] How does one do this?

Kp

Quote from: Shout on January 08, 2006, 02:23 AM
Quote from: Kp on January 07, 2006, 11:22 AM
If you're feeling really helpful, you should also turn on lexical highlighting.

[OT] How does one do this?

In vim, :sy on.  For the forum, you'd need a helper tool that can take lexically highlighted data in something else (BinaryChat, Visual Studio(?), vim, etc.) and generate a plaintext forum post, marking it up with [font color=] [/font] tags as it goes.  Then you post the resulting text.  You can see examples of this type of thing in the "Funny Clips from Op [vL]" thread, where some of the members post lexically highlighted chat logs.
[19:20:23] (BotNet) <[vL]Kp> Any idiot can make a bot with CSB, and many do!

shout

Quote from: Kp on January 08, 2006, 10:55 AM
Quote from: Shout on January 08, 2006, 02:23 AM
Quote from: Kp on January 07, 2006, 11:22 AM
If you're feeling really helpful, you should also turn on lexical highlighting.

[OT] How does one do this?

In vim, :sy on.  For the forum, you'd need a helper tool that can take lexically highlighted data in something else (BinaryChat, Visual Studio(?), vim, etc.) and generate a plaintext forum post, marking it up with [font color=] [/font] tags as it goes.  Then you post the resulting text.  You can see examples of this type of thing in the "Funny Clips from Op [vL]" thread, where some of the members post lexically highlighted chat logs.

I thought there might have been a tag.