小弟毕设是用VC设计数据权限管理软件,以前没学过C++,我负责的是服务器端的制作,它最重要的功能就是双机通信,也就是说接收客户端发来的信息并把信息加以验证后回复客户端消息是否允许客户端使用该软件。但小弟不知如何加上通信模块,小弟手头上有导师给的一个双机聊天的对话框工程,前面尝试过基于该程序加入CSocket的派生类监听和接收函数进行通信,但把该模块加入到我自己的工程运行后却发现双机并不能正常通信。
void CClientSocket::OnReceive(int nErrorCode) 
{
((CServersetDlg*)(AfxGetApp()->m_pMainWnd))->GetSocketMsg(this);
// TODO: Add your specialized code here and/or call the base class

CSocket::OnReceive(nErrorCode);
}     
void CQueue::OnAccept(int nErrorCode) 
{
CClientSocket*pSocket=new CClientSocket();
CServersetDlg*pWnd=((CServersetDlg*)(AfxGetApp()->m_pMainWnd));
if(pWnd->m_pSocket->Accept(*pSocket))
{
pWnd->m_SocketList.AddTail(pSocket);
pWnd->MessageBox("Listen a connect");
}
else delete pSocket;
// TODO: Add your specialized code here and/or call the base class

CSocket::OnAccept(nErrorCode);
}
  以上是派生的那两个类,各位大侠看有啥办法能让小弟完成基本的通信功能啊,就接受客户端发来的信息再给它返回一个消息就行啊。拜托拜托。

解决方案 »

  1.   

    看看Socket编程的基础东西吧
    这里有个步骤:http://www.cnblogs.com/xdotnet/archive/2008/01/22/1048550.html
      

  2.   

    建议你看看MSDN上CSocket或者CAsyncSocket的文档。CSocket 编程模型
    使用 CSocket 对象涉及创建数个 MFC 类对象并将它们关联起来。在下面的一般过程中,服务器套接字和客户端套接字都将采取每一步骤(步骤 3 除外,此步骤中每个套接字类型要求不同的操作)。提示   在运行时,服务器应用程序通常首先做好准备然后“侦听”客户端应用程序何时寻求连接。如果客户端尝试连接时服务器未准备好,一般需要用户应用程序稍后再尝试连接。
    设置服务器套接字和客户端套接字之间的通信 构造一个 CSocket 对象。 
    使用此对象创建基础 SOCKET 句柄。 
    对于 CSocket 客户端对象,除非需要数据文报套接字,否则通常应使用默认参数来 Create 该对象。对于 CSocket 服务器对象,则必须在 Create 调用中指定端口。 注意   CArchive 不适用于数据文报套接字。如果想将 CSocket 用于数据文报套接字,必须像使用 CAsyncSocket 那样使用该类,即不带存档。因为数据文报是不可靠的(不保证送达,并且可能重复或顺序不对),它们不能通过存档与序列化兼容。而您期望序列化操作可以可靠地、按顺序完成。如果试图将带 CArchive 对象的 CSocket 用于数据文报,则 MFC 断言失败。
    如果套接字是客户端对象,则调用 CAsyncSocket::Connect 将此套接字对象连接到服务器套接字。 
    - 或 - 如果套接字是服务器端对象,则调用 CAsyncSocket::Listen 开始侦听来自客户端的连接尝试。接收到连接请求时,调用 CAsyncSocket::Accept 接受该请求。 注意   Accept 成员函数采用对新的空 CSocket 对象的引用作为它的参数。在调用 Accept 之前,必须构造该对象。如果此套接字对象超出范围,则连接关闭。不要对这个新套接字对象调用 Create。
    创建一个 CSocketFile 对象,将 CSocket 对象与它关联起来。 
    创建一个 CArchive 对象用于加载(接收)或存储(发送)数据。此存档与 CSocketFile 对象关联。 
    注意,CArchive 不适用于数据文报套接字。 使用 CArchive 对象在客户端套接字与服务器套接字之间传递数据。 
    注意,不管是加载(接收)还是存储(发送),给定的 CArchive 对象只在一个方向上移动数据。某些情况下,需要使用两个 CArchive 对象:一个用于发送数据,一个用于接收确认。 接受连接并设置存档后,可以执行验证密码之类的任务。 销毁存档、套接字文件和套接字对象。 
    注意   CArchive 类提供了专门与 CSocket 类一起使用的 IsBufferEmpty 成员函数。例如,如果缓冲区包含多条数据消息,则需要一直循环到读完所有消息和清空缓冲区。否则,下一个指示有数据要接收的通知可能会无限期延迟。使用 IsBufferEmpty 可确保检索所有数据。有关使用 IsBufferEmpty 的示例,请参见 CHATSRVR 示例应用程序。有关 MFC 示例的源代码和信息,请参见 MFC 示例。
    Windows Sockets:操作顺序一文用示例代码阐释了此进程的两端。有关更多信息,请参见: Windows Sockets:流式套接字 
    Windows Sockets:数据文报套接字 创建和使用 CAsyncSocket 对象
    使用 CAsyncSocket 构造一个 CAsyncSocket 对象并使用该对象创建基础 SOCKET 句柄。 
    套接字的创建遵循两阶段构造的 MFC 模式。 例如: CAsyncSocket sock;
    sock.Create( );    // Use the default parameters
    - 或 - CAsyncSocket* pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create( nPort, SOCK_DGRAM );
    上面的第一个构造函数在堆栈上创建一个 CAsyncSocket 对象,第二个构造函数在堆上创建 CAsyncSocket。上面的第一个 Create 调用使用默认参数创建流式套接字,第二个 Create 调用创建具有指定端口和地址的数据文报套接字。(任一个 Create 版本都可以和任一种构造方法一起使用。) Create 的参数有: “端口”:短整型。 
    对于服务器套接字,必须指定端口。对于客户端套接字,通常接受此参数的默认值,该值允许 Windows Sockets 选择端口。 套接字类型:SOCK_STREAM(默认值)或 SOCK_DGRAM。 
    套接字“地址”,如“ftp.microsoft.com”或“128.56.22.8”。 
    该地址为网络上的网际协议 (IP) 地址。很可能要始终依赖此参数的默认值。 关于术语“端口”和“套接字地址”的解释见 Windows Sockets:端口和套接字地址。 如果套接字是客户端,则使用 CAsyncSocket::Connect 将此套接字对象连接到服务器套接字。 
    - 或 - 如果套接字是服务器,则将套接字设置为开始侦听(使用 CAsyncSocket::Listen)来自客户端的连接尝试。接收到连接请求时,用 CAsyncSocket::Accept 接受该请求。 接受连接后,可以执行验证密码等任务。 注意   Accept 成员函数采用对新的空 CSocket 对象的引用作为它的参数。在调用 Accept 之前,必须构造该对象。如果此套接字对象超出范围,则连接关闭。不要对这个新套接字对象调用 Create。有关示例,请参见文章 Windows Sockets:操作顺序。
    通过调用 CAsyncSocket 对象的封装 Windows Sockets API 函数的成员函数,与其他套接字进行通信。 
    请参见“MFC 参考”中的 Windows Sockets 规范和 CAsyncSocket 类。 销毁 CAsyncSocket 对象。 
    如果在堆栈上创建了套接字对象,当包含函数超出范围时将调用此对象的析构函数。如果使用 new 运算符在堆上创建了套接字对象,则您必须负责使用 delete 运算符销毁此对象。 析构函数在销毁对象之前调用对象的 Close 成员函数。 有关代码中该顺序的示例(实际上是对于 CSocket 对象),请参见 Windows Sockets:操作顺序。您对 CAsyncSocket 的责任
    创建 CAsyncSocket 类的对象后,该对象封装 Windows SOCKET 句柄并提供对此句柄的操作。使用 CAsyncSocket 时,如果您直接使用 API,则必须处理可能面对的所有问题。例如: “阻塞”方案。 
    发送和接收计算机之间的字节顺序差异。 
    在 Unicode 和多字节字符集 (MBCS) 字符串之间转换。 
    有关这些术语的定义和其他信息,请参见 Windows Sockets:阻塞、Windows Sockets:字节排序和 Windows Sockets:转换字符串。尽管存在这些问题,但如果应用程序需要您能获得所有的灵活性和控制能力,CAsycnSocket 类可能是正确的选择。如果应用程序没有这种需求,可考虑使用 CSocket 类。CSocket 向您隐藏大量详细信息:它在阻塞调用期间抽取 Windows 消息并赋予您访问 CArchive 的权限,而 CArchive 为您管理字节顺序差异和字符串转换。
      

  3.   

    你的功能处理只要在Accept 函数里处理就行了,至于通信最好是先找一个可以用的框架,该起来很快!
    否则你就得好好看看教程一点一点做了