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();
}
#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?
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.