最近在做一个UDP的聊天程序,但是对SendTo函数的返回值有点不太清楚,我查过MSDN,了解到他如果发送不成功就会返回一个SOCKET_ERROR,以下是一个enter 按钮的代码,问题出在这里,当我没有打开服务器的时候SendTo返回 0, 当打开服务器的时候也是返回 0,  我觉得当服务器没有打开的话,他就不会发送成功,应该返回 -1 才对,对此我有点困惑,希望朋友们能告诉我其中的原理!谢谢
void CMChartRoom_UDP_ClientDlg::OnBnClickedButtonEnterroom()
{

UpdateData(TRUE);
CString strEnterMsg;
int nSend; nSend=m_pClientSock->SendTo(
(LPCTSTR)strEnterMsg,
strEnterMsg.GetLength(),
m_ServerAddr.uiPort,
m_ServerAddr.strIPAddr
); if (nSend==SOCKET_ERROR    )
{ AfxMessageBox(_T("进入聊天室失败,可能服务器端还没有运行"));
return;
} this->GetDlgItem(IDC_BUTTON_ENTERROOM)->EnableWindow(FALSE);
this->GetDlgItem(IDC_BUTTON_LEAVEROOM)->EnableWindow(TRUE);
this->GetDlgItem(IDC_BUTTON_SENDMSG)->EnableWindow(TRUE);
((CEdit*)this->GetDlgItem(IDC_EDIT_SENDMSG))->SetReadOnly(FALSE);
((CEdit*)this->GetDlgItem(IDC_EDIT_SERVERIP))->SetReadOnly(TRUE);
((CEdit*)this->GetDlgItem(IDC_EDIT_SERVERPORT))->SetReadOnly(TRUE);
m_bEnterRoom=TRUE;}

解决方案 »

  1.   

    The successful completion of a SendTo does not indicate that the data has been successfully delivered.
      

  2.   

    你取WSAGetLastError.看看啊,发送成功应该返回的是发送的字节数。除非你发送的buf指定的长度是0才返回0
      

  3.   


    那请问     if (nSend==SOCKET_ERROR )
    {AfxMessageBox(_T("进入聊天室失败,可能服务器端还没有运行"));
    return;
    }
    这段话我怎么才能实现它?  我希望当服务器还没有打开的时候执行 :  AfxMessageBox(_T("进入聊天室失败,可能服务器端还没有运行"));
      

  4.   

    那我怎么样才能实现当我没打开服务器的时候,会执行 AfxMessageBox(_T("进入聊天室失败,可能服务器端还没有运行"));
      

  5.   

    你要用tcp连接方式,udp的本来就是无连接的,不保证通讯的。
      

  6.   

    UDP是无连接的,你是不会知道是否成功的。
      

  7.   

    其实我知道udp无连接,我只是想知道SendTo这个函数在什么情况下才算发送失败
      

  8.   

    sendto函数并不负责把要发送的数据传送到接收端,它只是负责把数据copy到发送缓存区,数据的发送是由协议来完成的。也就是说,服务器端是否打开是没什么影响的。