UDP通信问题,求高手指点 我要做一个客户端与服务器端的通信的程序,服务器端是固定IP的网络服务器,为什么我能从我局域网的客户端发送数据到服务器端,服务器端接收数据成功,并根据发送内容回发相应相应的UDP包到数据,但客户端此时不能收到网络服务器上的服务端的UDP包。但如果服务端(服务端程序)都在局域网内测试,完全没有问题,客户端能收到服务端返回的信息。谁有这方面的经验,求高手指点? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为中间经过了NAT,外网主动发起的连接会被丢弃,所以才有那么多打洞、穿透的解决办法http://www.cnblogs.com/Contlu/archive/2004/11/27/69543.htmlhttp://topic.csdn.net/u/20090922/14/b420e263-fa9e-4768-993d-3d9ae20151a7.html参考 内网是局域网,外网有路由器,两个路由器之间如果没有通信过,来的信息会被丢掉。你的信息被丢掉了所以就没办法通信,需要打洞,你在网上搜udp打洞就能够解决。 网络没学好啊要掌握4种常规UDP打洞方式 UDP完全可以打洞,而且UDP比TCPd打洞的成功率高好多倍。问题是你这里是如何“发送”的? 客户端必须是会话发起者。在服务端接收到客户端的消息的同时获得客户端的IP:PORT,服务端发送数据则发送到这个IP:PORT。这个IP:PORT是服务端动态获取的,而不是事先约定好的。明白这一点应该就没有你说的那个问题了。C++中通过sockaddr_in6结构获得客户端IP信息,例如:sockaddr_in6 tRecvProps; socklen_t nRecvPropLen; const int nBuffLen = 4096; char pBuff[nBuffLen]; while (!m_bExit) { nRecvPropLen = sizeof(sockaddr_in6); int numBytes = recvfrom(m_hSocket, pBuff, nBuffLen, 0, (sockaddr*)&tRecvProps, &nRecvPropLen); if (numBytes < 0) { printf("Socket I/O error: recvfrom returned an error\n"); continue; } if (numBytes < 1) { continue; } if (nRecvPropLen != sizeof(sockaddr_in) && nRecvPropLen != sizeof(sockaddr_in6)) { printf("I/O error: invalid sockaddr length\n"); continue; } int nPort = ntohs(tRecvProps.sin_port); // 这个就是PORT了 m_nBytesRead += numBytes; OnReceive(pBuff, numBytes, addr); }C#应该也有类似的方法 这种带公网IP的情况不需要NAT穿透的,只要有心跳就行了。 Form1 窗体已经显示 当点击Form2 窗体上的按钮后修改Form1 窗体Lable1的值 電腦病毒這種效果是怎麼實現的? 哪里有vss的服务器端下呀,给个有效地址,立马给f走人,偶也.... 两个listview模板类,另求动态模板postback后读取 !!!请教高手怎样在winform中获得网关,网卡(mac)地址?!!! 求盛大的面试经验 这个窗体如何关掉呢 求助——help,如何更新cookie啊 请问先辈们?一个DataGrid的问题? 介绍几本学习C#的好书 wpf中窗口跳转和页面跳转的问题 C# 调用DateTime ParseExact()问题
http://www.cnblogs.com/Contlu/archive/2004/11/27/69543.html
http://topic.csdn.net/u/20090922/14/b420e263-fa9e-4768-993d-3d9ae20151a7.html参考
要掌握4种常规UDP打洞方式
UDP完全可以打洞,而且UDP比TCPd打洞的成功率高好多倍。问题是你这里是如何“发送”的?
在服务端接收到客户端的消息的同时获得客户端的IP:PORT,服务端发送数据则发送到这个IP:PORT。这个IP:PORT是服务端动态获取的,而不是事先约定好的。明白这一点应该就没有你说的那个问题了。
C++中通过sockaddr_in6结构获得客户端IP信息,例如:sockaddr_in6 tRecvProps;
socklen_t nRecvPropLen;
const int nBuffLen = 4096;
char pBuff[nBuffLen]; while (!m_bExit)
{
nRecvPropLen = sizeof(sockaddr_in6);
int numBytes = recvfrom(m_hSocket, pBuff, nBuffLen, 0, (sockaddr*)&tRecvProps, &nRecvPropLen); if (numBytes < 0)
{
printf("Socket I/O error: recvfrom returned an error\n");
continue;
}
if (numBytes < 1)
{
continue;
} if (nRecvPropLen != sizeof(sockaddr_in) && nRecvPropLen != sizeof(sockaddr_in6))
{
printf("I/O error: invalid sockaddr length\n");
continue;
}
int nPort = ntohs(tRecvProps.sin_port); // 这个就是PORT了
m_nBytesRead += numBytes; OnReceive(pBuff, numBytes, addr);
}C#应该也有类似的方法