.hclass CWSocketServerDlg : public CDialog
{
// 构造
public:
CWSocketServerDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据
enum { IDD = IDD_WSOCKETSERVER_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:
afx_msg void OnBnClickedButton1();
static CString str_all;
static UINT BeginReceive(LPVOID pParam);
};.cppvoid CWSocketServerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CSocket* serversocket=new CSocket();
if(!(serversocket->Create(6000)))
{
MessageBox("端口创建失败");
}
if(serversocket->Listen())
{
AfxBeginThread(BeginReceive,serversocket);
}
delete serversocket;
}UINT CWSocketServerDlg::BeginReceive(LPVOID pParam)
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return 0;
}
CSocket* serversocket=(CSocket *)pParam;
CSocket* acceptsocket=new CSocket();
CString str1;
char buf[20];
serversocket->Accept(*acceptsocket);
while(1) //持续性线程函数里总会看到
{
acceptsocket->Receive(buf,20,0);
str1=buf;
//CWSocketServerDlg::str_all+="\r\n";
str_all+="\r\n"; 主要是这句
str_all+=str1;
AfxGetApp()->GetMainWnd()->SetDlgItemText(IDC_EDIT1,str_all);
}
delete acceptsocket;
return 0;
}
把线程函数定义成了对话框类的成员,所以要声明成静态的。在其中使用一个静态成员str_all,报错WSocketServerDlg.obj : error LNK2001: 无法解析的外部符号 "public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > CWSocketServerDlg::str_all" (?str_all@CWSocketServerDlg@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)应该怎么解决才可以用str_all
{
// 构造
public:
CWSocketServerDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据
enum { IDD = IDD_WSOCKETSERVER_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:
afx_msg void OnBnClickedButton1();
static CString str_all;
static UINT BeginReceive(LPVOID pParam);
};.cppvoid CWSocketServerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CSocket* serversocket=new CSocket();
if(!(serversocket->Create(6000)))
{
MessageBox("端口创建失败");
}
if(serversocket->Listen())
{
AfxBeginThread(BeginReceive,serversocket);
}
delete serversocket;
}UINT CWSocketServerDlg::BeginReceive(LPVOID pParam)
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return 0;
}
CSocket* serversocket=(CSocket *)pParam;
CSocket* acceptsocket=new CSocket();
CString str1;
char buf[20];
serversocket->Accept(*acceptsocket);
while(1) //持续性线程函数里总会看到
{
acceptsocket->Receive(buf,20,0);
str1=buf;
//CWSocketServerDlg::str_all+="\r\n";
str_all+="\r\n"; 主要是这句
str_all+=str1;
AfxGetApp()->GetMainWnd()->SetDlgItemText(IDC_EDIT1,str_all);
}
delete acceptsocket;
return 0;
}
把线程函数定义成了对话框类的成员,所以要声明成静态的。在其中使用一个静态成员str_all,报错WSocketServerDlg.obj : error LNK2001: 无法解析的外部符号 "public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > CWSocketServerDlg::str_all" (?str_all@CWSocketServerDlg@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)应该怎么解决才可以用str_all
解决方案 »
- 请教大神ListControl问题
- 想做个漂亮的界面,用什么好点。
- 如何拦截窗口中所有(包括控件和文本)的鼠标事件?
- ButtonST是不是把双击事件屏蔽掉了????
- 奇怪问题求助: 在已经打开的工程中,双击FILEVIEW中的某一文件,CPU100%
- how to change background color of scrollbar
- 事件模型下,WSAWaitForMultipleEvents超时错误,ERROR_INVALID_WINDOW_HANDLE ?
- 大家都是这样认为的吗,学vc的路
- 求救,不是有效的WIN32程序的问题!
- !!!!!!!!!!!!!盗取OICQ协议一份,大家看对不对!!!!!!!!!!!!!!!!!!!!!!!
- 关于网络通信程序的纪录痕迹,欢迎进入讨论
- 流媒体播放的问题
但accept这句没有死等,我还没有用客户端连接它,就已经开始执行while(1)了,怎么回事
类中的这句只是对对象的声明,你需要在外部(通常是.cpp文件中)明确定义对象
CString CWSocketServerDlg::str_all;
Ok?
静态函数里使用静态变量是没有问题的,但使用之前应该定义它