L19_1为客户端:
// L19_1.h : PROJECT_NAME 应用程序的主头文件 //
#pragma once
#ifndef __AFXWIN_H__ #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #endif
#include "resource.h" // 主符号
// CL19_1App: // 有关此类的实现,请参阅 L19_1.cpp //
class CL19_1App : public CWinApp { public: CL19_1App();
// 重写 public: virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP() virtual int ExitInstance(); };
extern CL19_1App theApp;
// L19_1.cpp : 定义应用程序的类行为。 //
#include "stdafx.h" #include "L19_1.h" #include "L19_1Dlg.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
// CL19_1App
BEGIN_MESSAGE_MAP(CL19_1App, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP()
// CL19_1App 构造
CL19_1App::CL19_1App() { // 支持重新启动管理器 m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 }
// 唯一的一个 CL19_1App 对象
CL19_1App theApp;
// CL19_1App 初始化
BOOL CL19_1App::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序中使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); // 创建 shell 管理器,以防对话框包含 // 任何 shell 树视图控件或 shell 列表视图控件。 CShellManager *pShellManager = new CShellManager; // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey("应用程序向导生成的本地应用程序"); //////////////////////////////////////////////////////// WSADATA wsd; //定义WSADATA对象 WSAStartup(MAKEWORD(2,2),&wsd); //初始化套接字 ///////////////////////////////////////////////////////// CL19_1Dlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码 }
// 删除上面创建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; }
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }
int CL19_1App::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 WSACleanup(); //释放套接字 return CWinApp::ExitInstance(); }
// L19_1Dlg.h : 头文件 //
#pragma once #include "resource.h" #include "afxwin.h" #include "winsock2.h" //引用文件头 #pragma comment(lib,"ws2_32.lib") //链接库文件 #define CM_RECEIVE 1000
// CL19_1Dlg 对话框 class CL19_1Dlg : public CDialogEx { // 构造 public: CL19_1Dlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据 enum { IDD = IDD_L19_1_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: CEdit m_ServerIP; CEdit m_ServerPort; CEdit m_NickName; CEdit m_login; CEdit m_SendData; CListBox m_MsgList; SOCKET m_SockClient; //定义套接字 UINT m_Port; //定义端口 CString m_IP; //定义IP int m_loginflag; void ReceiveInfo(); virtual BOOL PreTranslateMessage(MSG* pMsg); afx_msg void OnBnClickedLogin(); afx_msg void OnBnClickedSend(); };
// L19_1Dlg.cpp : 实现文件 //
#include "stdafx.h" #include "L19_1.h" #include "L19_1Dlg.h" #include "afxdialogex.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx { public: CAboutDlg();
// 对话框数据 enum { IDD = IDD_ABOUTBOX };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现 protected: DECLARE_MESSAGE_MAP() public: // virtual BOOL PreTranslateMessage(MSG* pMsg); };
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP()
// CL19_1Dlg 对话框
CL19_1Dlg::CL19_1Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CL19_1Dlg::IDD, pParent) , m_loginflag(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CL19_1Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_ServerIP); DDX_Control(pDX, IDC_EDIT2, m_ServerPort); DDX_Control(pDX, IDC_EDIT3, m_NickName); DDX_Control(pDX, IDC_EDIT4, m_login); DDX_Control(pDX, IDC_EDIT5, m_SendData); DDX_Control(pDX, IDC_LIST1, m_MsgList); }
BEGIN_MESSAGE_MAP(CL19_1Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_Login, &CL19_1Dlg::OnBnClickedLogin) ON_BN_CLICKED(IDC_Send, &CL19_1Dlg::OnBnClickedSend) END_MESSAGE_MAP()
// CL19_1Dlg 消息处理程序
BOOL CL19_1Dlg::OnInitDialog() { CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { //BOOL bNameValid; CString strAboutMenu; //bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); //ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码 m_SockClient = socket(AF_INET,SOCK_STREAM,0); //创建套接字 m_ServerIP.SetWindowText("169.254.238.79"); m_ServerPort.SetWindowText("5000"); m_login.SetWindowText("请登录"); m_loginflag=0;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
void CL19_1Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } }
// 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。
void CL19_1Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(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 { CDialogEx::OnPaint(); } }
//当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CL19_1Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); }
void CL19_1Dlg::ReceiveInfo() { char buffer[256]; //定义数据缓冲区 int num = recv(m_SockClient,buffer,256,0); //接收数据 buffer[num] = 0; //定义结束标记 m_MsgList.AddString(buffer); //读取数据到列表中 delete buffer; }
BOOL CL19_1Dlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if(pMsg->message==1000) { ReceiveInfo(); //触发函数 return TRUE; } else { return CDialogEx::PreTranslateMessage(pMsg); } }
void CL19_1Dlg::OnBnClickedLogin() { if(m_loginflag==0) { sockaddr_in serveraddr; //服务器端地址 CString strport; //定义字符串记录端口 m_ServerPort.GetWindowText(strport); //获取端口字符串 m_ServerIP.GetWindowText(m_IP); //获取IP if (strport.IsEmpty() || m_IP.IsEmpty())//判断端口和IP是否为空 { MessageBox("请设置服务器IP和端口号");//弹出提示对话框 return; } m_Port =atoi(strport); //将端口字符串转换为整数 serveraddr.sin_family = AF_INET; //设置服务器地址家族 serveraddr.sin_port = htons(m_Port); //设置服务器端口号 serveraddr.sin_addr.S_un.S_addr = inet_addr(m_IP.GetBuffer(m_IP.GetLength())); //设置服务器IP if (connect(m_SockClient,(sockaddr*)&serveraddr,sizeof(serveraddr))!=0) //开始连接服务器 { MessageBox("连接失败"); //弹出提示对话框 return; } else { MessageBox("连接成功"); //弹出提示对话框 m_login.SetWindowText("连接成功"); //显示连接状态 m_loginflag=1; //设置已连接标志 } WSAAsyncSelect(m_SockClient,m_hWnd,1000,FD_READ); //设置异步模型 CString strname,info ; //定义字符串变量 m_NickName.GetWindowText(strname); //获取昵称 info.Format("%s-->%s",strname,"进入聊天室"); //设置发送信息 send(m_SockClient,info.GetBuffer(0),info.GetLength(),0);//向服务器发送数据 } }
void CL19_1Dlg::OnBnClickedSend() { CString strData,name,info ; //定义字符串变量 m_NickName.GetWindowText(name); //获取昵称 m_SendData.GetWindowText(strData); //获取发送数据 if (!name.IsEmpty() && !strData.IsEmpty()) //判断字符串是否为空 { info.Format("%s说: %s",name,strData); //格式化发送的数据 send(m_SockClient,info.GetBuffer(0),info.GetLength(),0);//开始发送数据 m_MsgList.AddString(info); //向列表中添加数据 m_SendData.SetWindowText(""); //清空编辑框文本 } }
========================
L19_2为服务器
// L19_2.h : PROJECT_NAME 应用程序的主头文件 //
#pragma once
#ifndef __AFXWIN_H__ #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #endif
#include "resource.h" // 主符号
// CL19_2App: // 有关此类的实现,请参阅 L19_2.cpp //
class CL19_2App : public CWinApp { public: CL19_2App();
// 重写 public: virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP() virtual int ExitInstance(); };
extern CL19_2App theApp;
// L19_2.cpp : 定义应用程序的类行为。 //
#include "stdafx.h" #include "L19_2.h" #include "L19_2Dlg.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
// CL19_2App
BEGIN_MESSAGE_MAP(CL19_2App, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP()
// CL19_2App 构造
CL19_2App::CL19_2App() { // 支持重新启动管理器 m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 }
// 唯一的一个 CL19_2App 对象
CL19_2App theApp;
// CL19_2App 初始化
BOOL CL19_2App::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序中使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance(); AfxEnableControlContainer(); // 创建 shell 管理器,以防对话框包含 // 任何 shell 树视图控件或 shell 列表视图控件。 CShellManager *pShellManager = new CShellManager;
// 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); //////////////////////////////////////////////////////// WSADATA wsd; //定义WSADATA对象 WSAStartup(MAKEWORD(2,2),&wsd); //初始化套接字 ///////////////////////////////////////////////////////// CL19_2Dlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码 }
// 删除上面创建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; }
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }
int CL19_2App::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 WSACleanup(); //释放套接字 return CWinApp::ExitInstance(); }
// L19_2Dlg.h : 头文件 //
#pragma once #include "afxwin.h" #include "winsock2.h" //引用头文件 #pragma comment (lib,"ws2_32.lib") //链接库文件 #define MAXNUM 10
// CL19_2Dlg 对话框 class CL19_2Dlg : public CDialogEx { // 构造 public: CL19_2Dlg(CWnd* pParent = NULL); // 标准构造函数 SOCKET m_SockServer,m_SockClient; //定义套接字 SOCKET m_Clients[MAXNUM]; //客户端套接字 int m_ConnectNum; //当前链接的客户数 CString m_IP; //定义IP UINT m_Port; //定义端口 // 对话框数据 enum { IDD = IDD_L19_2_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: CEdit m_ServerIP; CEdit m_ServerPort; CEdit m_Set; int m_SetFlag; void TranslateData(void); virtual BOOL PreTranslateMessage(MSG* pMsg); afx_msg void OnBnClickedButton1(); };
// L19_2Dlg.cpp : 实现文件 //
#include "stdafx.h" #include "L19_2.h" #include "L19_2Dlg.h" #include "afxdialogex.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx { public: CAboutDlg();
// 对话框数据 enum { IDD = IDD_ABOUTBOX };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现 protected: DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP()
// CL19_2Dlg 对话框
CL19_2Dlg::CL19_2Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CL19_2Dlg::IDD, pParent) , m_SetFlag(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CL19_2Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_ServerIP); DDX_Control(pDX, IDC_EDIT2, m_ServerPort); DDX_Control(pDX, IDC_EDIT3, m_Set); }
BEGIN_MESSAGE_MAP(CL19_2Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CL19_2Dlg::OnBnClickedButton1) END_MESSAGE_MAP()
// CL19_2Dlg 消息处理程序
BOOL CL19_2Dlg::OnInitDialog() { CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码 m_SockServer = socket(AF_INET,SOCK_STREAM,0); //创建套接字 //将网络中的事件关联到窗口的消息函数中 WSAAsyncSelect(m_SockServer,m_hWnd,WM_USER+1,FD_WRITE|FD_READ|FD_ACCEPT); m_ConnectNum = 0; //初始化客户端连接数量 for (int i = 0; i< MAXNUM;i++) m_Clients[i]= 0; //初始化客户端套接字 m_ServerIP.SetWindowText("169.254.238.79"); //预设IP地址 m_ServerPort.SetWindowText("5000"); //预设端口号 m_Set.SetWindowText("请设置"); //提示状态 m_SetFlag=0; //已设置标志 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
void CL19_2Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } }
// 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。
void CL19_2Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(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 { CDialogEx::OnPaint(); } }
//当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CL19_2Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); }
void CL19_2Dlg::TranslateData(void) { sockaddr_in serveraddr; //定义网络地址 char buffer[256]; //定义缓冲区 int len =sizeof(serveraddr); //获取网络地址大小 int curlink = -1; //定义客户端索引初值 int num = -1; //定义客户端接收的数据数初值 for (int i = 0; i < MAXNUM; i++) //遍历客户端套接字 { num= recv(m_Clients[i],buffer,256,0); //接收客户端的数据 if (num != -1) //判断哪个客户端向服务器发送数据 { curlink = i; //记录客户端索引 break; //终止循环 } } buffer[num]= 0; //设置数据结束标志 if (num == -1) //接受客户端的连接 { if (m_ConnectNum < MAXNUM) //判断当前客户端连接是否大于上限 { m_Clients[m_ConnectNum] = //接受客户端的连接 accept(m_SockServer,(struct sockaddr*)&serveraddr,&len); m_ConnectNum++; //将连接数量加1 } return; } for(int j=0;j<m_ConnectNum;j++) send(m_Clients[j],buffer,num,0); //将接收的数据发送给客户端,不向发送方本身发送数据 //if (j != curlink) }
BOOL CL19_2Dlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if(pMsg->message==WM_USER+1) { TranslateData(); //触发函数 return TRUE; } else return CDialogEx::PreTranslateMessage(pMsg); }
void CL19_2Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 if(m_SetFlag==0) { m_ServerIP.GetWindowText(m_IP); CString strPort; m_ServerPort.GetWindowText(strPort); if (m_IP.IsEmpty() || strPort.IsEmpty()) { MessageBox("请设置服务器IP和端口号","提示"); return; } m_Port = atoi((const char*)strPort.GetBuffer(strPort.GetLength())); sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_addr.S_un.S_addr = inet_addr(m_IP.GetBuffer(m_IP.GetLength())); serveraddr.sin_port = htons(m_Port); if (bind(m_SockServer,(sockaddr*)&serveraddr,sizeof(serveraddr))) { MessageBox("绑定地址失败."); return; } else { MessageBox("绑定地址成功."); m_Set.SetWindowText("设置成功"); m_SetFlag=1; } listen(m_SockServer,20); } }