vc 下socket编程的一些代码

 //MySocket.h

#pragma once

// CMySocket 命令目标

class CMySocket : public CAsyncSocket
{
public:
 CMySocket();
 virtual ~CMySocket();
 CDialog* m_pWnd;
public:
 void SetParent(CDialog* pWnd);
public:
 virtual void OnAccept(int nErrorCode);
public:
 virtual void OnConnect(int nErrorCode);
public:
 virtual void OnClose(int nErrorCode);
public:
 virtual void OnReceive(int nErrorCode);
public:
 virtual void OnSend(int nErrorCode);
};

 //

// socket.h : PROJECT_NAME 应用程序的主头文件
//

#pragma once

#ifndef __AFXWIN_H__
 #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif

#include "resource.h"  // 主符号


// CsocketApp:
// 有关此类的实现,请参阅 socket.cpp
//

class CsocketApp : public CWinApp
{
public:
 CsocketApp();

// 重写
 public:
 virtual BOOL InitInstance();

// 实现

 DECLARE_MESSAGE_MAP()
};

extern CsocketApp theApp;

 

///

// socketDlg.h : 头文件
//

#pragma once
#include "afxwin.h"
#include "mysocket.h"


// CsocketDlg 对话框
class CsocketDlg : public CDialog
{
// 构造
public:
 CsocketDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
 enum { IDD = IDD_SOCKET_DIALOG };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持


// 实现
protected:
 HICON m_hIcon;

 // 生成的消息映射函数
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 DECLARE_MESSAGE_MAP()
public:
 int m_iType;
public:
 CString m_strName;
public:
 int m_iPort;
public:
 CButton m_ctlConnect;
public:
 CString m_strMessage;
public:
 CListBox m_ctlSent;
public:
 CListBox m_ctlRecvd;
public:
 afx_msg void OnBnClickedRclient();
 CMySocket m_sListenSocket;
 CMySocket m_sConnectSocket;
public:
 afx_msg void OnBnClickedBconnect();
public:
 void OnAccept(void);
public:
 void OnConnect(void);
public:
 void OnSend(void);
public:
 void OnReceive(void);
public:
 void OnClose(void);
public:
 afx_msg void OnBnClickedBsend();
public:
 afx_msg void OnBnClickedBclose();
};

//

// MySocket.cpp : 实现文件
//

#include "stdafx.h"
#include "socket.h"
#include "MySocket.h"
#include "socketDlg.h"


// CMySocket

CMySocket::CMySocket()
: m_pWnd(NULL)
{
}

CMySocket::~CMySocket()
{
}


// CMySocket 成员函数

void CMySocket::SetParent(CDialog* pWnd)
{
 m_pWnd = pWnd;
}

void CMySocket::OnAccept(int nErrorCode)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(nErrorCode == 0)
  ((CsocketDlg*)m_pWnd)->OnAccept();

 CAsyncSocket::OnAccept(nErrorCode);
}

void CMySocket::OnConnect(int nErrorCode)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(nErrorCode == 0)
  ((CsocketDlg*)m_pWnd)->OnConnect();

 CAsyncSocket::OnConnect(nErrorCode);
}

void CMySocket::OnClose(int nErrorCode)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(nErrorCode == 0)
  ((CsocketDlg*)m_pWnd)->OnClose();

 CAsyncSocket::OnClose(nErrorCode);
}

void CMySocket::OnReceive(int nErrorCode)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(nErrorCode == 0)
  ((CsocketDlg*)m_pWnd)->OnReceive();

 CAsyncSocket::OnReceive(nErrorCode);
}

void CMySocket::OnSend(int nErrorCode)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(nErrorCode==0)
  ((CsocketDlg*)m_pWnd)->OnSend();

 CAsyncSocket::OnSend(nErrorCode);
}

// socket.cpp : 定义应用程序的类行为。
//

#include "stdafx.h"
#include "socket.h"
#include "socketDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CsocketApp

BEGIN_MESSAGE_MAP(CsocketApp, CWinApp)
 ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CsocketApp 构造

CsocketApp::CsocketApp()
{
 // TODO: 在此处添加构造代码,
 // 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CsocketApp 对象

CsocketApp theApp;


// CsocketApp 初始化

BOOL CsocketApp::InitInstance()
{
 // 如果一个运行在 Windows XP 上的应用程序清单指定要
 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
 //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
 INITCOMMONCONTROLSEX InitCtrls;
 InitCtrls.dwSize = sizeof(InitCtrls);
 // 将它设置为包括所有要在应用程序中使用的
 // 公共控件类。
 InitCtrls.dwICC = ICC_WIN95_CLASSES;
 InitCommonControlsEx(&InitCtrls);

 CWinApp::InitInstance();

 if (!AfxSocketInit())
 {
  AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
  return FALSE;
 }

 AfxEnableControlContainer();

 // 标准初始化
 // 如果未使用这些功能并希望减小
 // 最终可执行文件的大小,则应移除下列
 // 不需要的特定初始化例程
 // 更改用于存储设置的注册表项
 // TODO: 应适当修改该字符串,
 // 例如修改为公司或组织名
 SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

 CsocketDlg dlg;
 m_pMainWnd = &dlg;
 INT_PTR nResponse = dlg.DoModal();
 if (nResponse == IDOK)
 {
  // TODO: 在此处放置处理何时用“确定”来关闭
  //  对话框的代码
 }
 else if (nResponse == IDCANCEL)
 {
  // TODO: 在此放置处理何时用“取消”来关闭
  //  对话框的代码
 }

 // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
 //  而不是启动应用程序的消息泵。
 return FALSE;
}

// socketDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "socket.h"
#include "socketDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

// 对话框数据
 enum { IDD = IDD_ABOUTBOX };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CsocketDlg 对话框

 


CsocketDlg::CsocketDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CsocketDlg::IDD, pParent)
 , m_iType(0)
 , m_strName(_T(""))
 , m_iPort(0)
 , m_strMessage(_T(""))
{
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CsocketDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 DDX_Radio(pDX, IDC_RCLIENT, m_iType);
 DDX_Text(pDX, IDC_ESERVNAME, m_strName);
 DDX_Text(pDX, IDC_ESERVPORT, m_iPort);
 DDX_Control(pDX, IDC_BCONNECT, m_ctlConnect);
 DDX_Text(pDX, IDC_EMSG, m_strMessage);
 DDX_Control(pDX, IDC_LSENT, m_ctlSent);
 DDX_Control(pDX, IDC_LRECVD, m_ctlRecvd);
}

BEGIN_MESSAGE_MAP(CsocketDlg, CDialog)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 //}}AFX_MSG_MAP
 ON_BN_CLICKED(IDC_RCLIENT, &CsocketDlg::OnBnClickedRclient)
 ON_BN_CLICKED(IDC_RSERVER, &CsocketDlg::OnBnClickedRclient)
 ON_BN_CLICKED(IDC_BCONNECT, &CsocketDlg::OnBnClickedBconnect)
 ON_BN_CLICKED(IDC_BSEND, &CsocketDlg::OnBnClickedBsend)
 ON_BN_CLICKED(IDC_BCLOSE, &CsocketDlg::OnBnClickedBclose)
END_MESSAGE_MAP()


// CsocketDlg 消息处理程序

BOOL CsocketDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // 将“关于...”菜单项添加到系统菜单中。

 // IDM_ABOUTBOX 必须在系统命令范围内。
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
 //  执行此操作
 SetIcon(m_hIcon, TRUE);   // 设置大图标
 SetIcon(m_hIcon, FALSE);  // 设置小图标

 // TODO: 在此添加额外的初始化代码
 m_iType = 0;
 m_strName = "loopback";
 m_iPort = 9999;
 UpdateData(FALSE);
 m_sConnectSocket.SetParent(this);
 m_sListenSocket.SetParent(this);

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CsocketDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CsocketDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 用于绘制的设备上下文

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

  // 使图标在工作矩形中居中
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // 绘制图标
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CsocketDlg::OnQueryDragIcon()
{
 return static_cast(m_hIcon);
}


void CsocketDlg::OnBnClickedRclient()
{
 // TODO: 在此添加控件通知处理程序代码
 UpdateData(TRUE);
 if(m_iType == 0)
  m_ctlConnect.SetWindowText("Connect");
 else
  m_ctlConnect.SetWindowText("Listen");
}

void CsocketDlg::OnBnClickedBconnect()
{
 // TODO: 在此添加控件通知处理程序代码
 UpdateData(TRUE);
 GetDlgItem(IDC_BCONNECT)->EnableWindow(FALSE);
 GetDlgItem(IDC_ESERVNAME)->EnableWindow(FALSE);
 GetDlgItem(IDC_ESERVPORT)->EnableWindow(FALSE);
 GetDlgItem(IDC_STATICNAME)->EnableWindow(FALSE);
 GetDlgItem(IDC_STATICPORT)->EnableWindow(FALSE);
 GetDlgItem(IDC_RCLIENT)->EnableWindow(FALSE);
 GetDlgItem(IDC_RSERVER)->EnableWindow(FALSE);
 GetDlgItem(IDC_STATICTYPE)->EnableWindow(FALSE);

 if(m_iType == 0)
 {
  m_sConnectSocket.Create();
  m_sConnectSocket.Connect(m_strName, m_iPort);
 }
 else
 {
  m_sListenSocket.Create(m_iPort);
  m_sListenSocket.Listen();
 }

}

void CsocketDlg::OnAccept(void)
{
 m_sListenSocket.Accept(m_sConnectSocket);
 GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
 GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
 GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
 AfxMessageBox("Accept");
}

void CsocketDlg::OnConnect(void)
{
 GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
 GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
 GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
 GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
}

void CsocketDlg::OnSend(void)
{
}

void CsocketDlg::OnReceive(void)
{
 char *pBuf = new char[1025];
 int iBufSize = 1024;
 int iRcvd;
 CString strRecvd;

 iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
 if(iRcvd == SOCKET_ERROR)
 {
 }
 else
 {
  pBuf[iRcvd] = NULL;
  strRecvd = pBuf;
  m_ctlRecvd.AddString(strRecvd);
  UpdateData(FALSE);
 }
}

void CsocketDlg::OnClose(void)
{
 m_sConnectSocket.Close();
 GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
 GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
 GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE);
 GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);

 if(m_iType == 0)
 {

 GetDlgItem(IDC_BCONNECT)->EnableWindow(TRUE);
 GetDlgItem(IDC_ESERVNAME)->EnableWindow(TRUE);
 GetDlgItem(IDC_ESERVPORT)->EnableWindow(TRUE);
 GetDlgItem(IDC_STATICNAME)->EnableWindow(TRUE);
 GetDlgItem(IDC_STATICPORT)->EnableWindow(TRUE);
 GetDlgItem(IDC_RCLIENT)->EnableWindow(TRUE);
 GetDlgItem(IDC_RSERVER)->EnableWindow(TRUE);
 GetDlgItem(IDC_STATICTYPE)->EnableWindow(TRUE);
 }
}

void CsocketDlg::OnBnClickedBsend()
{
 // TODO: 在此添加控件通知处理程序代码
 int iLen;
 int iSent;

 UpdateData(TRUE);
 if(m_strMessage != "")
 {
  iLen = m_strMessage.GetLength();
  iSent = m_sConnectSocket.Send(LPCTSTR(m_strMessage),iLen);
  if(iSent == SOCKET_ERROR)
  {
  }
  else
  {
   m_ctlSent.AddString(m_strMessage);
   UpdateData(FALSE);
  }
 }
}

void CsocketDlg::OnBnClickedBclose()
{
 // TODO: 在此添加控件通知处理程序代码
 OnClose();
}

 

你可能感兴趣的:(c++学习,socket,编程,sockets,null,class,dialog)