小弟刚开始学WINSOCK,想尝试编写一个最简单的UDP点对点的聊天工具。使用MFC的基本对话框。
因为想随时接受显示对方发来的话。所以我在::OnInitDialog()中完成接受SOCKET的设置和绑定,然后设置一个1秒记数器。
然后在::OnTimer()中加入
if ((Ret = recvfrom(ReceivingSocket, recbuff, 256, 0,
       (SOCKADDR *)&SenderAddr, &SenderAddrSize)) == SOCKET_ERROR)
   {
      AfxMessageBox("ERROR: recvfrom failed with error");
      closesocket(ReceivingSocket);
      WSACleanup();
      return;
   }
CClientDC dc(this);
SetBkColor(dc.m_hDC,RGB(220,220,220));
TextOut(dc.m_hDC,140,330,recbuff,256);这样一运行就程序停止响应,感觉如果能得到判断对方是否有数据发送过来的BOOL量来控制上面程序的执行就不会出现停止响应的程序。也就是说想只有当对方有数据发送过来时候上面的语句才执行。不知道我这种想法是不是可行。如果可行请告诉我怎么判断。如果不行请告诉我应该怎么解决。
我说的有点乱,对不起了。请大家帮帮忙!

解决方案 »

  1.   

    不用OnTimer(),直接用void OnReceive(int nErrorCode);函数就可以,但是你必须从CAsyncSocket类派生一个class,并用void OnReceive(int nErrorCode)做成员函数就行,还有在创建dialog的时候,应该在创建的第二步,把windows socket选中,否则要手工添加lib.
      

  2.   


    停止响应是因为recvfrom没有返回,
    它在收到消息时才会返回。你要用异步套接字,如楼上
      

  3.   

    use CAsyncSocket,example:
    http://www.vckbase.com/document/viewdoc/?id=440
      

  4.   

    我按2楼的方法做了。把接受SOCKET的初始化和绑定还有接受都放到OnReceive()中
    并且
    CClientDC dc(this);
    SetBkColor(dc.m_hDC,RGB(220,220,220));
    TextOut(dc.m_hDC,140,330,recbuff,256);无法执行,因为不是从CWnd类派生出来的,所以
    换成了AfxMessageBox(recbuff);
    来显示对方发来的话。这样没有停止响应的现象,但是对方发送语句过来他那边显示了发送成功,但是我这却一点反应也没。还有
    kingzai你给的那个示例连接打不开啊。