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;
};
#endifIlmeisesti 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.