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 = FX_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); //创建套接字
//将网络中的事件关联到窗口的消息函数中
WSAAsyncSelectm_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);
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);
}
}
建议你,先把要实现的功能描述出来,然后再把错误触发的情况描述出来,最好加上截图。
贴这么多代码,额。。。能花时间去推荐的人,真的不多。大家其实都比较忙。也都乐于助人。
前提是,时间成本也别太高了。。