.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

解决方案 »

  1.   

    还有一个问题,我用一个线程内部的变量替换这个str_all实现了功能
    但accept这句没有死等,我还没有用客户端连接它,就已经开始执行while(1)了,怎么回事
      

  2.   

    static CString str_all;
    类中的这句只是对对象的声明,你需要在外部(通常是.cpp文件中)明确定义对象
    CString CWSocketServerDlg::str_all;
    Ok?
      

  3.   

    同意lixuefei
    静态函数里使用静态变量是没有问题的,但使用之前应该定义它
      

  4.   

    都定义在一个类下面,而且str_all定义在线程函数的外层,有直接的穿透能力
      

  5.   

    我声明的str_all是一个CString的实体对象,声明时按说就已经分配了内存空间,就已经定义了。就好象 int a 一个意思