[转帖]VC开发 基于Winsock API的VC网络编程实战 -----程序代码_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3661 | 回复: 0   主题: [转帖]VC开发 基于Winsock API的VC网络编程实战 -----程序代码        下一篇 
ulee@land
注册用户
等级:上尉
经验:769
发帖:55
精华:1
注册:2012-12-17
状态:离线
发送短消息息给ulee@land 加好友    发送短消息息给ulee@land 发消息
发表于: IP:您无权察看 2012-12-18 10:34:17 | [全部帖] [楼主帖] 楼主

VC开发基于Winsock APIVC网络编程实战 -----程序代码

/////////////////////北京联动北方科技有限公司=北京联动北方科技有限公司/////////////////////////
#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->eerInfo (&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, "lease 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;
}


  四、小结

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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论