用CAysncSocket 实现UDP通信,
Client端:
 初始化:
 sockClient.Create(atoi(m_strPort2),SOCK_DGRAM);
 发送:
       char *pbuf[1024];
*pbuf=(LPSTR)(LPCTSTR)str;
char *pAddress[100];
*pAddress=(LPSTR)(LPCTSTR)address; if (SOCKET_ERROR==SendTo(*pbuf,1024,atoi(port),*pAddress,0))
{
showActionMsg("发送失败 ");
return false;
}
    //显时IP和端口
showSendMsg("IP地址:  "+address+"   端口:  "+port);
  接收:
void CBCSock::OnReceive(int nErrorCode)
{
//得到客户A的地址和端口
CString rPeerAddress;
UINT    rPeerPort;; showActionMsg("进入CBCSock::OnReceive()");   char buff[1024];
   memset(buff,0,sizeof(buff));
   int nRead;
   nRead = ReceiveFrom(buff, sizeof(buff),rPeerAddress,rPeerPort,0);   char temp[10];
   itoa(nRead,temp,10);
   showActionMsg(temp);
   switch (nRead)
   {
   case 0:
   showActionMsg("收到零个字符");
      Close();
      break;
   case SOCKET_ERROR:
      if (GetLastError() != WSAEWOULDBLOCK) 
      {
         showActionMsg ("读取数据时产生错误");
         Close();
      }
      break;
   default:
      buff[nRead] ='\0'; //terminate the string     
   }
   itoa(rPeerPort,temp,10);
   showActionMsg("IP地址:  "+rPeerAddress+"   端口:  "+temp);
   showRecieveMsg(buff);
   showRecieveMsg("IP地址:  "+rPeerAddress+"   端口:  "+temp+" : ");   CAsyncSocket::OnReceive(nErrorCode);
}Server端:
  初始化:
   if (!sockServer.Create(atol(m_strPort),SOCK_DGRAM))     //绑定此端口
{
m_listAction.InsertString(0,"创建接收套接字出现错误!");
}
else
{
m_listAction.InsertString(0,"创建接收套接字成功");                  //插入列表框中
}
  接收:
void CBCSock::OnReceive(int nErrorCode)
{
  //得到客户A的地址和端口
   CString rPeerAddress;
  UINT    rPeerPort;;   Sleep(100);
   char buff[1024];
   memset(buff,0,sizeof(buff));
   int nRead;
   nRead = ReceiveFrom(buff,sizeof(buff),rPeerAddress,rPeerPort);   char temp[10];
   itoa(nRead,temp,10);
   showActionMsg(temp);
   long L=-1;
   switch (nRead)
   {
   case 0:
   showActionMsg("收到零个字符");
       Close();
       break;
   case SOCKET_ERROR:
   L=GetLastError();
      if (L != WSAEWOULDBLOCK) 
      {
         
 char __temp[200];
 itoa(l,__temp,10);
 CString __str=__temp;
 showActionMsg ("读取数据时产生错误,代码: "+__str);
 Close();
      }
      break;
   default:
      showActionMsg("读取到数据");
      buff[nRead] ='\0'; //terminate the string     
  itoa(rPeerPort,temp,10);
   
   }   CAsyncSocket::OnReceive(nErrorCode);
}
  发送:
bool CBCSock::SendMSG(CString str,CString address,CString port,CString strName)
{
      char *pbuf[1024];
*pbuf=(LPSTR)(LPCTSTR)str;
char *pAddress[100];
*pAddress=(LPSTR)(LPCTSTR)address; if (SOCKET_ERROR==SendTo(*pbuf,1024,atoi(port),*pAddress,0))
{
showActionMsg("发送失败 ");
return false;

在同一台计算机上或同一个局域网内,client与server通信,很正常,
把sever放在一个公网IP上,与局域网内或是公网上通信,刚开始server收发数据很正常,
如果停止收发(程序都不退出),大概几十秒后,server向客户端发数据时,出现错误
却进入了OnRecieve函数(为什么?),执行这段代码:
  case SOCKET_ERROR:
   L=GetLastError();
      if (l != WSAEWOULDBLOCK) 
      {
         
 char __temp[200];
 itoa(l,__temp,10);
 CString __str=__temp;
 showActionMsg ("读取数据时产生错误,代码: "+__str);
 Close();
      }
      break;
得到的错误代码为:0(即L);刚开始回传正常,双方停止一段时间,之后client不先发信息,server先向client发,出现上述错误,
请高手指点!
谢谢