18,356
社区成员
发帖
与我相关
我的任务
分享
点对点发送速度就很快,但是组播就很慢,这个怎么解?本来想组播节省带宽提高传输效率,结果好了,如此之慢,还不如点对点发送了,但是跨交换机点对点不能充分利用带宽。
代码如下
发送端:
int nRet = 0;
SOCKET clientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (INVALID_SOCKET == clientSocket)
{
return;
}
const int SendSize = 65000;
vector<char> Buff;
Buff.resize(SendSize );
sockaddr_in dstAddr;
dstAddr.sin_family = AF_INET;
dstAddr.sin_port = htons(8887);
dstAddr.sin_addr.S_un.S_addr = inet_addr("234.2.2.2");//组播地址
while (!m_bStop) {
while (!LimitSpeed.CanConsume()) {
Sleep(1);
}
nRet = sendto(clientSocket, &Buff[0], Buff.size(), 0, (sockaddr*)&dstAddr,
sizeof(dstAddr));
if (nRet > 0) {
;
}
else {
nRet = WSAGetLastError();
OutputDebugStringA(std::to_string(nRet).c_str());
}
}
closesocket(clientSocket);
接收端代码:
const int nBufferLen = 65000;
SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //创建服务器socket
if (INVALID_SOCKET == serSocket )
{
return;
}
int nRet = 0;
int optlen = sizeof(nBufferLen);
nRet = setsockopt(serSocket , SOL_SOCKET, SO_RCVBUF, (const char*)&nBufferLen, optlen);
//设置传输协议、端口以及目的地址
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8887);
serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
if (::bind(serSocket , (sockaddr*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
closesocket(serSocket );
return;
}
vector<char> Buff;
Buff.resize(nBufferLen);
std::string strMsg;
//加入组播组
ip_mreq multiCast;
multiCast.imr_interface.S_un.S_addr = INADDR_ANY;
multiCast.imr_multiaddr.S_un.S_addr = inet_addr("234.2.2.2"); //组播组的IP地址。
nRet = setsockopt(serSocket , IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast));
sockaddr_in clientAddr;
while (!m_bStop)
{
//开始接收数据
int iAddrlen = sizeof(clientAddr);
int len = recvfrom(serSocket , (char*)&Buff[0], nBufferLen, 0, (sockaddr*)&clientAddr, &iAddrlen);
if (len > 0)
{
strMsg = inet_ntoa(clientAddr.sin_addr);
strMsg += " recv len:";
strMsg += std::to_string(len);
OutputDebugStringA(strMsg.c_str());
}
else {
strMsg = inet_ntoa(clientAddr.sin_addr);
strMsg += " recv failed:";
strMsg += std::to_string(WSAGetLastError());
OutputDebugStringA(strMsg.c_str());
}
}
if(serSocket != INVALID_SOCKET)
nRet = setsockopt(serSocket , IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast));
是中途经过了一个垃圾交换机,换了那个交换机就好了,NND