Socks...


zoopp


Buna. Vreau sa creez o aplicatie server/client cu ajutorul acestui tutorial http://www.codeproject.com/KB/IP/beginningtcp_cpp.aspx. In timp ce-l studiam am ajuns intr-un stadiu in care nu mai stiu ce sa fac.

Nu stiu exact ce este un message handler (inca). Tin sa cred ca problema aparuta se invarte in jurul lui.

CODSURSA
#define MY_MESSAGE_NOTIFICATION 1048
#include "windows.h"
#include "winsock.h"

SOCKET server_socket;
WSADATA wsadata;


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) //handle the messages
    {
    case MY_MESSAGE_NOTIFICATION: //Is a message being sent?
        {
            switch (lParam) //If so, which one is it?
            {
                case FD_ACCEPT:
                    //Connection request was made
                    break;

                case FD_CONNECT:
                    //Connection was made successfully
                    break;

                case FD_READ:
                    //Incoming data; get ready to receive
                    break;

                case FD_CLOSE:
                    //Lost the connection
                    break;
            }
        }
    default: //The message doesn't concern us
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
}

int ListenOnPort(int portno);
void CloseConnection();

int WINAPI WinMain(HINSTANCE CurrentInstance, HINSTANCE hPrevInstance, LPSTR Arguments, int nCmdShow)
{

    ListenOnPort(2158);
    MessageBox(NULL, "X","X",NULL);
    CloseConnection();
    return true;
}


int ListenOnPort(int portno)
{
    int error = WSAStartup(0x0202, &wsadata);

    if(error)
    {
        return false;
    }

    if(wsadata.wVersion != 0x0202)
    {
        WSACleanup();
        return false;
    }

    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(portno);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if(server_socket == INVALID_SOCKET)
    {
        return false;
    }

    if(bind(server_socket, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
    {
        return false;
    }

    listen(server_socket, SOMAXCONN);
    WSAAsyncSelect(server_socket, hwnd, MY_MESSAGE_NOTIFICATION, (FD_ACCEPT | FD_CONNECT | FD_READ | FD_CLOSE));
    return true;
}

void CloseConnection()
{
     if(server_socket)
         closesocket(server_socket);
     WSACleanup();
}


Cam asta e ceea ce am facut pana acum. De aici nu mai stiu sa continui incat nu pot compila codul. Cred ca stiu si de ce: pt ca WSAAsyncSelect nu are acces la variabila hwnd din WndProc. Am dreptate? confusedsmiley.png

Cum ar trebui sa continui?

Edit: Nu vreau sa fac ceva extraoridnar. Vreau ca serverul sa execute anumite actiuni (precum miscarea pointerului etc.) pe baza mesajelor primite din afara.
NumeDeCod
N-ai nici o fereastra creata, iti lipseste bucla de preluare si procesare a mesajelor fundamentala oricarei aplicatii windows, deci chiar daca s-ar compila si ar rula, imediat dupa ce inchizi MessageBox-ul executia se incheie...
 
zoopp
Nu am nevoie neaparat de fereastra. O simpla consola din care sa pot citi output-ul e suficienta. Am incercat folosind acesta clasa: http://www.codeproject.com/KB/IP/client_server_socket.aspx. Merge..dar am nevoie de mai mult. Sunt limitat la "one-thread-per-client".

In total am 6 persoane care se conecteaza la serverul meu => 6 thread-uri (pe 6 porturi diferite - 6 socketuri (echivalentul a 6 servere) + 2 care se ocupa de niste operatiuni de rutia + main-ul ceea ce este cam..aiurea.

Nu vreau sa fac ceva foarte sofisticat. Cred ca ati prins ideea.
dani.user
De ce 6 porturi diferite?
Mai exerseaza WinAPI daca vrei socket'uri asincrone.
Nu te opreste nimeni in schimb sa folosesti socket'uri sincrone si select()
zoopp
Tocmai asta incercam sa fac. Dar m-am impotmolit in acel "message handler".
cspot
In primul rand trebuie sa definesti o fereastra fie ca iti convine fie ca nu .
WSAAsyncSelect(server_socket, hwnd, MY_.... <<< Hwnd asta ar fi variabila ferestrei declarate ....iar
LRESULT CALLBACK WndProc(H .... ar fi procesatorul de mesaje pentru fereastra respectiva .

Cu alte cuvinte functia WSAAsyncSelect va pasa mesajele catre o fereastra definita de tine , fereastra care va procesa mesajele sosite prin intermediul WndProc .
zoopp
Multumesc pentru hint cspot! Acum stiu ce am de facut smile.gif
 
Aceasta este o versiune simplificatã a paginii originale. Pentru a vizita versiunea originala click aici.