Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: WinAPI & WinSock

kayttaja-3842 [16.11.2008 21:23:12]

#

Terve vaan kaikille...

Eli pitäs saada tuossa WinAPI:ssa toimimaan socketit...

Tässä olisi tarvittavat osat minun koodistani

(Mod. huom: ehkä viestin sisältö on helpompi bongata tästä kuin satojen koodirivien puolivälistä. ^^)
Elikkä tuossa koodissa on sellanen vika, että kun yritän yhdistää irc serverille protocol olion alla oleva connect funktio palauttaa falsen eli yhteittä ei muka saatu, mutta WinAPI palautta FD_CONNECT:SSA että yhteys olisikin saatu... Mikä voisi olla vikana kun connect palauttaa false vaikka WinAPI:n mukaan yhteys saatiikin luotua onnistuneesti... :O

gui.cpp

 LRESULT CALLBACK MessageHandler( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ){






    switch ( Msg ){


      case WM_ONSOCKET:{

            if (WSAGETSELECTERROR(lParam))
            {
              WSACleanup ();
              return 0;
            }



       		switch ( WSAGETSELECTEVENT ( lParam ) )
			{
				case FD_READ:

					break;
				case FD_WRITE:

					break;
				case FD_CONNECT:

                    MessageBox(hWnd, "Connect opened to server!", "Information", MB_OK|MB_ICONINFORMATION);

					break;
			}
      }
      break;

      case WM_SIZE:

           RECT rectStatus;
           SendMessage(hWndStatus, WM_SIZE, 0, 0);
           GetWindowRect(hWndStatus, &rectStatus);

      break;

       case WM_DESTROY:
          {
              PostQuitMessage( 0 );
              return true;
          }
       break;

       case WM_CREATE:

            CreateStatusBar(hWnd);

            hWndCon = CreateButton(hWnd, 10, 10, 100, 25, CONNECT_BUTTON, "Connect");

       break;

       case WM_COMMAND:

        switch(wParam){

         case CONNECT_BUTTON:{


          }

         break;

        }

       break;

    }

    return DefWindowProc( hWnd, Msg, wParam, lParam );
}


 HRESULT CreateWin( HINSTANCE hInstance, int nCmdShow ){
    HWND hWnd;
    WNDCLASS wc;

    wc.style       = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = MessageHandler;
    wc.cbClsExtra  = 0;
    wc.cbWndExtra  = 0;
    wc.hInstance   = hInstance;
    wc.hIcon       = LoadIcon((HINSTANCE) NULL,IDI_APPLICATION);
    wc.hCursor     = LoadCursor((HINSTANCE) NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "MainWinClass";

    if (!RegisterClass(&wc))
       return false;

    hWnd = CreateWindow( "MainWinClass",
                         "-----",
                         WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         330,
                         180,
                         (HWND)  NULL,
                         (HMENU) NULL,
                         hInstance,
                         (LPVOID) NULL );

    if( !hWnd )
        return false;

    ShowWindow( hWnd, nCmdShow);
    UpdateWindow( hWnd );


      if(!protocol.Init()){
       MessageBox(hWnd, "Can't initialize protocol!", "Error!", MB_OK|MB_ICONERROR);
       return false;
      }else{

         hWnd = protocol.Select(hWnd);

          SendMessage(hWndStatus, WM_SETTEXT, 0, (WPARAM)"Status: Connecting to server, please wait.");

          if(!protocol.Connect()){
                  MessageBox(hWnd, "Can't connect to server!", "Error!", MB_OK|MB_ICONERROR);
                  SendMessage(hWndStatus, WM_SETTEXT, 0, (WPARAM)"Status: Disconnected");
                  SendMessage(hWndCon, WM_SETTEXT, 0, (WPARAM)"Connect");
            }else{
                 SendMessage(hWndStatus, WM_SETTEXT, 0, (WPARAM)"Status: Connected");
                 SendMessage(hWndCon, WM_SETTEXT, 0, (WPARAM)"Disconnect");
           }


      }




    return true;
 }

protocol.cpp

 #include "protocol.h"

  PROTOCOL::PROTOCOL(){}

  bool PROTOCOL::Init(){

     if ( WSAStartup(MAKEWORD(2, 2), &pType.wsadata) == SOCKET_ERROR )
		return false;

     if( pType.wsadata.wVersion != MAKEWORD(2, 2) )
        return false;

     pType.sockCon = socket(AF_INET, SOCK_STREAM, 0 );

	memset ( &pType.sa, 0, sizeof ( pType.sa ));
	pType.sa.sin_family = AF_INET;
	pType.sa.sin_port = htons(6667);
	pType.sa.sin_addr.s_addr = inet_addr ("83.140.172.210");

    return true;
  }

  bool PROTOCOL::Connect(){

       if (connect( pType.sockCon, (LPSOCKADDR)&pType.sa, sizeof ( pType.sa )) == SOCKET_ERROR )
		  return false;

   return true;
  }

  HWND PROTOCOL::Select(HWND hWnd){

    WSAAsyncSelect( pType.sockCon, hWnd, WM_ONSOCKET, (FD_READ | FD_WRITE | FD_CONNECT));

   return hWnd;
  }

  SOCKET PROTOCOL::getSocket(){ return pType.sockCon; }

protocol.h

#ifndef PROTOCOL_H
 #define PROTOCOL_H

  #include "init.h"


   struct PROTOCOL_TYPE{
      SOCKET sockCon;
      struct sockaddr_in sa;
      WSADATA wsadata;
   };

   class PROTOCOL{

     public:
       PROTOCOL();
       bool Init();
       bool Connect();
       HWND Select(HWND hWnd);
       SOCKET getSocket();
     private:
      PROTOCOL_TYPE pType;
   };

#endif

Metabolix [16.11.2008 21:53:33]

#

Ilmeisesti käytät ei-blokkaavia socketteja. Voisit siinä tapauksessa tutustua myös dokumentaatioon aiheesta.

http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx (connect function) kirjoitti:

With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK. — —

Ole hyvä ja lue itse lisää.

kayttaja-3842 [16.11.2008 22:28:48]

#

Kiitoksia paljon Metabolix...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta