加入组播时失败,错误返回10049

wanghuijun_22 2012-08-02 09:18:16
同样的程序,一台机子成功,另一台机子失败
代码如下:
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = htonl(mMulticastIP);
mreq.imr_interface.s_addr = INADDR_ANY;
ret = setsockopt(mSckReceiver, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char *)&mreq, sizeof(mreq));
其中在一台机子上ret的值为0,另一台机子ret的值为-1

困惑中,在线等
...全文
881 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
ret = setsockopt(mSckReceiver, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char *)&mreq, sizeof(mreq));
其中在一台机子上ret的值为0,另一台机子ret的值为-1
---------------
WSAGetLastError()是什么?
[/Quote]
Sorry,没看标题,你的mMulticastIP是多少?

ip_mreq mcast;
mcast.imr_interface.S_un.S_addr = INADDR_ANY;
mcast.imr_multiaddr.S_un.S_addr = inet_addr("224.100.100.100");
setsockopt(socksend,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mcast,sizeof(mcast));
Eleven 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
ret = setsockopt(mSckReceiver, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char *)&mreq, sizeof(mreq));
其中在一台机子上ret的值为0,另一台机子ret的值为-1
---------------
WSAGetLastError()是什么?
[/Quote]
Sorry,没看标题,10049: 在其上下文中,该请求的地址无效。
Eleven 2012-08-31
  • 打赏
  • 举报
回复
ret = setsockopt(mSckReceiver, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char *)&mreq, sizeof(mreq));
其中在一台机子上ret的值为0,另一台机子ret的值为-1
---------------
WSAGetLastError()是什么?
智慧msnd 2012-08-31
  • 打赏
  • 举报
回复
我也遇到了这个问题,一台电脑OK,另一台电脑失败。你找到问题的原因了吗??
tyong 2012-08-03
  • 打赏
  • 举报
回复
另外在上层增加对接收消息的处理:

afx_msg LRESULT OnReceive(WPARAM wParam, LPARAM lParam);

ON_MESSAGE(WM_MULTIPOINTEVENT, OnReceive)

// 功能描述:接收到多播数据后的回调函数
LRESULT CHuanRemoteServiceDlg::OnReceive(WPARAM wParam, LPARAM lParam)
{
SOCKET sockfd = (SOCKET)wParam;
if(WSAGETSELECTERROR(lParam) != 0)
{
TRACE("ERROR : Recv - %d .\n", WSAGetLastError());
m_nMultSocket.Close();
return 0;
}

sockaddr_in from;
int ret, salen = sizeof(from);
char buff[BUF_SIZE + 1];
CString strMsg;
switch(WSAGETSELECTEVENT(lParam))
{
case FD_WRITE:
TRACE("Now can sending data now!\n");
break;
case FD_READ:
ret = m_nMultSocket.RecvData(buff, BUF_SIZE, (sockaddr *) & from, & salen);
if(ret == SOCKET_ERROR)
{
m_nMultSocket.Close();
}
else if(ret != 0)
{
buff[ret] = '\0';
strMsg = (CString)buff;
}
break;
case FD_QOS:
break;
case FD_GROUP_QOS:
break;
default:
break;
}

return 0;
}
tyong 2012-08-03
  • 打赏
  • 举报
回复
.cpp的内容:

// MulticastSocket.cpp : implementation file
//

#include "stdafx.h"
#include "MulticastSocket.h"
#include "HuanRemoteServiceDlg.h"
#include "atlconv.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CMulticastSocket::CMulticastSocket()
{
m_hWnd = NULL;
m_bConnected = FALSE;
m_sockRecv = INVALID_SOCKET;
m_sockGroup = INVALID_SOCKET;
}

CMulticastSocket::~CMulticastSocket()
{

}

BOOL CMulticastSocket::InitInstance()
{
WSADATA wsadata;
if(WSAStartup(0x0202, & wsadata) != 0)
{
TRACE("ERROR : InitInstance !\n");
return FALSE;
}
return TRUE;
}

BOOL CMulticastSocket::UninInstance()
{
if(WSACleanup() != 0)
{
TRACE("ERROR : UninInstance - %d .\n", WSAGetLastError());
return FALSE;
}
return TRUE;
}

BOOL CMulticastSocket::IsConnected()
{
return m_bConnected;
}

BOOL CMulticastSocket::CreateInstance(const char* strGroupAddr, unsigned short sPort, HWND hWnd)
{
if(m_bConnected == TRUE)
{
TRACE("Has created successfully .\n");
return TRUE;
}

m_hWnd = hWnd;
m_sockRecv = socket(AF_INET, SOCK_DGRAM, 0);
if(m_sockRecv == INVALID_SOCKET)
{
TRACE("ERRROR : socket - %d .\n", WSAGetLastError());
return FALSE;
}

int optval = 1;
if(setsockopt(m_sockRecv, SOL_SOCKET, SO_REUSEADDR, (char *) & optval, sizeof(optval)) == SOCKET_ERROR)
{
TRACE("ERRROR : setsockopt(SO_REUSEADDR) - %d .\n", WSAGetLastError());
return FALSE;
}

m_saLocal.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
m_saLocal.sin_family = AF_INET;
m_saLocal.sin_port = htons(sPort);
if(bind(m_sockRecv, (sockaddr *) & m_saLocal, sizeof(m_saLocal)) == SOCKET_ERROR)
{
TRACE("ERRROR : bind(SO_REUSEADDR) - %d .\n", WSAGetLastError());
return FALSE;
}

m_saGroup.sin_addr.S_un.S_addr = inet_addr(strGroupAddr);
m_saGroup.sin_family = AF_INET;
m_saGroup.sin_port = htons(sPort);

ip_mreq mcast;
mcast.imr_multiaddr.S_un.S_addr = m_saGroup.sin_addr.S_un.S_addr;
mcast.imr_interface.S_un.S_addr = m_saLocal.sin_addr.S_un.S_addr;
if (setsockopt(m_sockRecv, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) & mcast, sizeof(mcast)) == SOCKET_ERROR)
{
TRACE("ERRROR : setsockopt(IP_ADD_MEMBERSHIP) - %d .\n", WSAGetLastError());
return FALSE;
}

//optval = 16;
optval = 1;
if (setsockopt(m_sockRecv, IPPROTO_IP, IP_MULTICAST_TTL, (char *) & optval, sizeof(optval)) == SOCKET_ERROR)
{
TRACE("ERRROR : setsockopt(IP_MULTICAST_TTL) - %d .\n", WSAGetLastError());
return FALSE;
}

int ret = WSAAsyncSelect(m_sockRecv, m_hWnd, WM_MULTIPOINTEVENT, FD_WRITE | FD_READ | FD_QOS | FD_GROUP_QOS | FD_CONNECT);
if(ret == SOCKET_ERROR)
{
TRACE("ERRROR : WSAAsyncSelect - %d .\n", WSAGetLastError());
return FALSE;
}
m_bConnected = TRUE;

return TRUE;
}

int CMulticastSocket::RecvData(char * pData, int nSize, sockaddr * pSA, int * pSALen)
{
if(m_bConnected == FALSE)
{
TRACE("ERROR : RecvData - m_bConnected == FALSE .\n");
return SOCKET_ERROR;
}

int ret;
if((ret = recvfrom(m_sockRecv, pData, nSize, 0, pSA, pSALen)) == SOCKET_ERROR)
{
TRACE("ERROR : recvfrom - %d .\n", WSAGetLastError());
return SOCKET_ERROR;
}

return ret;
}

int CMulticastSocket::SendData(const char * pData, int nSize)
{
if(m_bConnected == FALSE)
{
TRACE("ERROR : SendData - m_bConnected == FALSE .\n");
return SOCKET_ERROR;
}

int ret = sendto(m_sockRecv, pData, nSize, 0, (sockaddr *) & m_saGroup, sizeof(m_saGroup));
if(ret == SOCKET_ERROR)
{
TRACE("ERROR : sendto -- %d .\n", WSAGetLastError());
return SOCKET_ERROR;
}

return ret;
}

void CMulticastSocket::Close()
{
if(m_sockRecv != INVALID_SOCKET)
{
///////////////////////////////凑合着用
ip_mreq mcast;
mcast.imr_multiaddr.S_un.S_addr = m_saGroup.sin_addr.S_un.S_addr;
mcast.imr_interface.S_un.S_addr = m_saLocal.sin_addr.S_un.S_addr;
if (setsockopt(m_sockRecv, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&mcast, sizeof(mcast)) == SOCKET_ERROR)
{
TRACE("ERRROR : setsockopt(IP_DROP_MEMBERSHIP) - %d .\n", WSAGetLastError());
}
///////////////////////////////
closesocket(m_sockRecv);
}

if(m_sockGroup != INVALID_SOCKET)
{
closesocket(m_sockGroup);
}

m_hWnd = NULL;
m_bConnected = FALSE;
m_sockRecv = INVALID_SOCKET;
m_sockGroup = INVALID_SOCKET;
}
tyong 2012-08-03
  • 打赏
  • 举报
回复
我现在使用的一个组播类,
.h文件的内容:

#if !defined(AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_)
#define AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// MulticastSocket.h : header file
//

#define BUF_SIZE 1024

class CMulticastSocket : public CObject
{
public:
CMulticastSocket();
virtual ~CMulticastSocket();

public:
static BOOL InitInstance();
static BOOL UninInstance();

public:
BOOL IsConnected();
BOOL CreateInstance(const char* strGroupAddr, unsigned short sPort, HWND hWnd);
int RecvData(char * pData, int nSize, sockaddr * pSA = NULL, int * pSALen = NULL);
int SendData(const char * pData, int nSize);
void Close();

public:
HWND m_hWnd;
SOCKET m_sockGroup;
SOCKET m_sockRecv;
BOOL m_bConnected;

sockaddr_in m_saGroup;
sockaddr_in m_saLocal;
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_)
wanghuijun_22 2012-08-02
  • 打赏
  • 举报
回复
各位大侠快来帮忙,自己顶一下

18,357

社区成员

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

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