我想实现这样一个功能:对网络的操作,全部放在一个类中进行,包括数据的发送,接收,以及一些数据的初步处理,然后这个类把接受到的数据发给主程序,现在碰到一个问题:对于事件如何处理?比如,类接收到了数据,然后经过一些初始的处理,需要把这些数据发给主程序处理,主程序如何才能知道这个时候需要去处理类发来的数据了呢?希望能够有一个比较详细的叙述谢谢!
解决方案 »
- 请教CTabCtrl添加两个Dialog,如何从dialog1获取dialog2的地址?
- int转TCHAR
- 如何获取vc.net的第三级菜单?
- 20分求msdn library-january 2001下载地址
- 请叫高手们一个问题,我如何把我 在试图中画的图形 保存成.BMP的图文件存到某个路径下!!!!!!!
- 三个错误,救我啊!!!
- 如何通过编写代码创建快捷方式?又如何调用该快捷方式呢?(内空)
- 请问Borland C++中可以直接用SDK函数吗?
- 我该怎么办?有个小公司给我的工资很高(达到他的要求基本工资为4500,做项目另算),但是同时又有一家北大的知名公司...
- 如何禁止第二个程序实例
- XP下面新创建的文件都是可存档文件?
- 关于listctrl, 困扰小弟多日的问题,求救!
//-----------------------------
谢谢!
那什么样的东西可以满足我的要求呢
本例用它可以发送、接收、连接、断开和获取对方端口各种不同的信息。该类的主要优点是完全将连接对象化,不需要窗口就可以处理网络消息,通过定义回调函数或事件即可,甚至连通知消息都可以不用。对正在开发网络应用程序朋友,该类会对你有所帮助。
//////////////////////////////////////////////
#include <windows.h>
#include "resource.h"
#include "CConnection.h"
extern HWND hWndDialog; // used to pass the handle of the dialog the main.cpp
extern CConnection* Connection;
extern CNetworking Networking;
#define CONNECT_PORT 10205
void ReceiveCallback (DWORD ptr);
void CloseCallback (DWORD ptr);
void AcceptCallback (DWORD ptr);
BOOL CALLBACK SendString(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);BOOL CALLBACK SendFile(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);BOOL CALLBACK ConnectToIP(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);//////////////////////////////////////////////////////mian.cpp
#include "main.h"
#define MAX_LOADSTRING 100
HINSTANCE hInst; // current instance
HWND hWnd, hWndDialog; // handle of the dialog
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
CNetworking Networking;
CConnection* Connection = NULL;
int connections[8]; // holds our connection slots...
// Foward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void ReceiveCallback (DWORD ptr)
{
char buff[1024] = "";
CConnection* c = reinterpret_cast <CConnection*> (ptr);
c->Receive (buff, 1024);
MessageBox (hWnd, buff, "Information", MB_OK | MB_ICONINFORMATION);
}void CloseCallback (DWORD ptr)
{
MessageBox (hWnd, "The connection was closed.", "Information", MB_OK | MB_ICONINFORMATION);
}void AcceptCallback (DWORD ptr)
{
char cip[15];
unsigned int cp = 0;
CNetworking* net = reinterpret_cast <CNetworking*> (ptr);
if (Connection && Connection->IsConnected ())
{
CConnection* c = net->GetAccepted ();
while (c)
{
char nocon[] = "The host can not accept your connection at this time.";
c->Send (nocon, sizeof (nocon));
c->Disconnect ();
delete c;
c = net->GetAccepted ();
};
}
else
{
if (Connection)
delete Connection;
Connection = net->GetAccepted ();
Connection->PeerInfo (&cip[0], 15, &cp);
Connection->SetReceiveFunc (ReceiveCallback);
Connection->SetCloseFunc (CloseCallback);
char ci[128];
sprintf (ci, "A connection was accepted.\n\nClient Information:\n %s:%i\n\n", cip, cp);
MessageBox (hWnd, ci, "Client Info", MB_OK | MB_ICONINFORMATION);
}
}
---------
//后面还有一段
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
// TODO: Place code here.
MSG msg;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDS_NETWORKING, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_NETWORKING);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = (LPCSTR)IDM_NETWORKING;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_CREATE:
{
hWndDialog = NULL;
SetWindowPos (hWnd, HWND_TOP, 0, 0, 200, 44, SWP_NOOWNERZORDER | SWP_NOMOVE);
char jakobIP[225] = "";
Networking.GetLocalIPs (jakobIP, 225);
MessageBox(NULL, jakobIP, "Info", NULL);
Networking.SetAcceptFunc (AcceptCallback);
break;
}
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_EXIT:
DestroyWindow (hWnd);
break;
case IDM_LISTEN:
if (Connection)
{
if (MessageBox (hWnd, "You are still connected to a computer.\nPress Yes if you want
to disconnect and No to abort.\n\nSince this is just a demonstration of what you
can\ndo with Networking I kept things simple.", NULL, MB_YESNO | MB_ICONSTOP) == IDNO)
break;
delete Connection;
Connection = NULL;
}
if (!Networking.Listen (CONNECT_PORT))
{
char cPort[1024] = "";
sprintf (cPort, "Unable to listen at port %i", CONNECT_PORT);
MessageBox (hWnd, cPort, NULL, MB_OK | MB_ICONSTOP);
}
else
{
char cPort[1024] = "";
sprintf (cPort, "Now listening at port %i!\nPress 'Ok' to accept
incoming connections.", CONNECT_PORT);
MessageBox (hWnd, cPort, "Listening", MB_OK | MB_ICONINFORMATION);
}
break;
case IDM_CANCELLISTEN:
if (Networking.IsListening ())
Networking.StopListen ();
else
MessageBox (hWnd, "Unable to cancel listen-process!\nMake sure you are listening.",
NULL, MB_OK | MB_ICONINFORMATION);
break;
case IDM_CONNECT:
{
if (Connection)
{
Connection->Disconnect ();
}
DialogBox (hInst, "CONNECTIP", hWnd, ConnectToIP);
break;
}
case IDM_SENDMSG:
if (!Connection)
MessageBox(hWnd, "Please connect before sending data.", NULL,
MB_OK | MB_ICONINFORMATION);
else
DialogBox(hInst, "SENDMSG", hWnd, SendString);
break;
case IDM_DISCONNECT:
if (Connection)
Connection->Disconnect ();
else
MessageBox (hWnd, "Unable to close connection!\nMake sure you are connected.",
NULL, MB_OK | MB_ICONINFORMATION);
break;
case IDM_LISTLAN:
{
char lanlist[1024] = "";
Networking.GetNeighborhood (lanlist, 1024);
MessageBox (hWnd, lanlist, "Information", MB_OK | MB_ICONINFORMATION);
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
return 0;
}