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
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ää.
Kiitoksia paljon Metabolix...
Aihe on jo aika vanha, joten et voi enää vastata siihen.