| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
Winsock API的VC网络编程
作者:佚名    文章来源:网络    点击数:    更新时间:2006-11-24
 



  二、编程步骤

  1、 启动Visual C++6.0,生成一个Win32 exe应用程序,将该程序命名为"CNetWorking"

  2、 定义CNetWorking类,由于篇幅原因,具体实现参见代码部分,这里不给出其实现源代码;

  3、 设计程序的对话框和菜单(参见代码部分);

  4、 添加代码,编译运行程序。
 三、程序代码

//////////////////////////////////////////////
#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;
}

  四、小结


  本实例用它可以发送、接收、连接、断开和获取对方端口各种不同的信息。该类的主要优点是完全将连接对象化,不需要窗口就可以处理网络消息,通过定义回调函数或事件即可,甚至连通知消息都可以不用。如果读者朋友正在开发网络应用程序,那么该类也许会对你有所帮助。

上一页  [1] [2] [3] [4] 


  • 上一篇文章:

  • 下一篇文章: 没有了
  • 相关文章