关于SendTo函数的返回值问题

qianchenjie 2012-04-05 04:04:43
最近在做一个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;

}
...全文
4235 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
znn04006518 2012-09-03
  • 打赏
  • 举报
回复
sendto函数并不负责把要发送的数据传送到接收端,它只是负责把数据copy到发送缓存区,数据的发送是由协议来完成的。也就是说,服务器端是否打开是没什么影响的。
qianchenjie 2012-04-07
  • 打赏
  • 举报
回复
其实我知道udp无连接,我只是想知道SendTo这个函数在什么情况下才算发送失败。。。
qianchenjie 2012-04-06
  • 打赏
  • 举报
回复
嗯 好的,我试试~
zhanshen2891 2012-04-06
  • 打赏
  • 举报
回复
做一个登陆过程,也就是你需要等待服务器给你返回结果,如果一段时间都没有,就认为不通。
lijianli9 2012-04-06
  • 打赏
  • 举报
回复
你要用tcp连接方式,udp的本来就是无连接的,不保证通讯的。
qianchenjie 2012-04-06
  • 打赏
  • 举报
回复
那我怎么样才能实现当我没打开服务器的时候,会执行 AfxMessageBox(_T("进入聊天室失败,可能服务器端还没有运行"));
zhanshen2891 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 2 楼 的回复:
你取WSAGetLastError.看看啊,发送成功应该返回的是发送的字节数。

除非你发送的buf指定的长度是0才返回0



对的,我看了一下的确返回字节数,但是问题是我还没有打开服务器呀,照理来说他应该失败,怎么会发送成功啊。。。。郁闷
[/Quote]

没打开服务器也能发送成功!
以免我忘记 2012-04-06
  • 打赏
  • 举报
回复
UDP是无连接的,你是不会知道是否成功的。
灌水九段 2012-04-06
  • 打赏
  • 举报
回复
用tcp做吧
qianchenjie 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
你取WSAGetLastError.看看啊,发送成功应该返回的是发送的字节数。

除非你发送的buf指定的长度是0才返回0
[/Quote]


对的,我看了一下的确返回字节数,但是问题是我还没有打开服务器呀,照理来说他应该失败,怎么会发送成功啊。。。。郁闷
qianchenjie 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
The successful completion of a SendTo does not indicate that the data has been successfully delivered.
[/Quote]

对的,我看了一下的确返回字节数,但是问题是我还没有打开服务器呀,照理来说他应该失败,怎么会发送成功啊。。。。郁闷
qianchenjie 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
The successful completion of a SendTo does not indicate that the data has been successfully delivered.
[/Quote]

那请问 if (nSend==SOCKET_ERROR )
{

AfxMessageBox(_T("进入聊天室失败,可能服务器端还没有运行"));
return;
}
这段话我怎么才能实现它? 我希望当服务器还没有打开的时候执行 : AfxMessageBox(_T("进入聊天室失败,可能服务器端还没有运行"));
zhanshen2891 2012-04-05
  • 打赏
  • 举报
回复
你取WSAGetLastError.看看啊,发送成功应该返回的是发送的字节数。

除非你发送的buf指定的长度是0才返回0
lijianli9 2012-04-05
  • 打赏
  • 举报
回复
The successful completion of a SendTo does not indicate that the data has been successfully delivered.

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧