接收指定IP的UDP数据包问题。

waitlife 2007-02-26 10:48:42
头文件中定义部分:

CString strSrvIP, strLocalIP;
CSocket m_SendSocket;
CSocket m_ReceiveSocket;
void SendData();
void ReceiveData();

初始化部分:
v_dwSrvIP = (inet_addr("61.145.75.86"));
v_uiSrvPort = 27017;
v_uiLocalPort = 7110;
v_strSendMsg = A2S_INFO;
v_strReceiveMsg = _T("");
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = v_dwSrvIP;
strSrvIP = inet_ntoa(local.sin_addr);
strLocalIP = _T("127.0.0.1");

OnInitDialog()函数中的部分:

if(m_ReceiveSocket.Create(v_uiSrvPort, SOCK_DGRAM, NULL) == 0)
{
GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
}
m_ReceiveSocket.Bind(v_uiSrvPort, strLocalIP);
if(m_SendSocket.Create(v_uiLocalPort, SOCK_DGRAM, NULL) == 0)
{
GetDlgItem(IDC_RECEIVE)->EnableWindow(FALSE);
}
m_SendSocket.Bind(v_uiLocalPort, strLocalIP);

函数实现部分:

void CCSManDlg::SendData()
{
char chrSend[A2S_INFO_LENGTH];
::SecureZeroMemory(chrSend, sizeof(chrSend));
USES_CONVERSION;
strcpy_s(chrSend, sizeof(chrSend), W2A(v_strSendMsg));
m_SendSocket.SendTo(chrSend, sizeof(chrSend), v_uiSrvPort, strSrvIP, 0);
}
void CCSManDlg::ReceiveData()
{
char chrReceive[A2S_INFO_LENGTH];
::SecureZeroMemory(chrReceive, sizeof(chrReceive));
m_ReceiveSocket.ReceiveFrom(chrReceive, sizeof(chrReceive), strLocalIP, v_uiLocalPort, 0);
USES_CONVERSION;
v_strReceiveMsg = A2W(chrReceive);
}

经截包工具测试,已经成功发送至指定的服务器IP,服务器返回udp数据包(已经知道其数据格式),但无法接收,在ReceiveFrom()函数中停住,DEBUG调试发现缓冲区没有内容,在一直等待接收,请教各位该如何修改?谢谢!
...全文
953 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jazzlover 2007-03-23
  • 打赏
  • 举报
回复
我估计是:
你指定的 strLocalIP = "127.0.0.1" 是loop 地址,所以收不到外埠发来的包, 你试一下用和服务器同网络的地址. 比如 服务器是 "192.168.0.10" ,你用本机的局域网地址 192.168.0.xx
waitlife 2007-02-28
  • 打赏
  • 举报
回复
m_SendSocket.Create(v_uiLocalPort, SOCK_DGRAM, NULL)是指定发送端口
为何不能接收服务器返回的数据包呢?
df8327 2007-02-27
  • 打赏
  • 举报
回复
我怀疑你是先发送然后才调用Recv
你可以在抓包的时候看看你的系统是否声称icmp端口不可达报文
如果生成证明数据包到达的时候没有接受进程监听该端口
在MFC中接受数据要么开新线程
要么是用系统自带的CSOCKET模型
你是如何做的啊?
geniusdot 2007-02-27
  • 打赏
  • 举报
回复
搂住这里strLocalIP = _T("127.0.0.1");
用本地地址
m_ReceiveSocket.ReceiveFrom(chrReceive, sizeof(chrReceive), strLocalIP, v_uiLocalPort, 0);
接收的应该是本地的数据吧.不是远端服务器的.
没仔细看只是觉的这个有点怪
waitlife 2007-02-27
  • 打赏
  • 举报
回复
这个例子是《VC编程技巧500例》光盘中的“无连接方式”示例,我试过,如果发送和接收都是本机,则正常。
双杯献酒 2007-02-27
  • 打赏
  • 举报
回复
对于CSocket
m_ReceiveSocket.Create(v_uiSrvPort, SOCK_DGRAM, NULL)
后,不再需要
m_ReceiveSocket.Bind(v_uiSrvPort, strLocalIP);
因为Creat会自动bind

由于一个PORT只能Bind一个SOCKET
所以发送应该
m_SendSocket.Create(0, SOCK_DGRAM, NULL)
并且不要Bind
在sendto的时候再指定port和ip
双杯献酒 2007-02-27
  • 打赏
  • 举报
回复
UDP接收好象只能指定端口(Bind).
IP是[OUT]参数.
waitlife 2007-02-27
  • 打赏
  • 举报
回复
请帮帮忙看看,谢谢!
waitlife 2007-02-27
  • 打赏
  • 举报
回复
我用的是MFC的CSocket类呀!这些代码是我参考《VC编程技巧500例》光盘中的“无连接方式”示例。运行光盘上的可以成功发送和接收,但它的发送和接收都是本地IP(127.0.0.1),发送端口是6800,接收端口是6801。

18,357

社区成员

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

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