|
|
Hi
I'm trying to extend Marco Zaratti's CCESocket class to cater for multicasting.
I'm just getting to grips with both winsock and multicasting but have come to a brick wall.
The basic pseudocode of Marco's class goes like this:
CCESocket::Create(SOCK_DGRAM)
s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
[my overridden function]
CMultiSock::Accept(localPort,localAddress)
CCESocket::Accept(localport)
m_localAddress.sin_family = AF_INET;
m_localAddress.sin_port = htons(localPort);
m_localAddress.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR*) &m_localAddress, sizeof(SOCKADDR_IN))
recvfrom(s,buf, bufSize, 0, (SOCKADDR*)&m_localAddress, &m_receiveAddrSz);
return
[my extra code to add multicast functionality in overridden Accept func]
<code>m_mReq.imr_multiaddr.s_addr = inet_addr("234.5.6.7");
m_mReq.imr_interface.s_addr = INADDR_ANY;
m_localAddress.sin_addr.S_un.S_addr = inet_addr("234.5.6.7");
m_localAddress.sin_port = localport;
setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&m_mReq,sizeof(ip_mreq));
CreateEvent(NULL,FALSE,FALSE,L"Multicast-Event");
setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addr,sizeof(addr));
int TTL = 32 ;
nRet = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL,(char*)&TTL, sizeof(TTL));
int loop = 1;
setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP,(char*)&loop, sizeof(loop));</code>
all returns are checked and this section has no problems
when I attempt to do a CCESocket::Send, the method goes through the accepting case, and sends to localaddress.
case SOCK_DGRAM:
if(m_udpReadyToSend)
{
while(len > 0)
{
if(m_socketState == ACCEPTING)
sentBytes = sendto(s, &buf[dataPtr], len, 0, (SOCKADDR*) &m_localAddress, sizeof(m_localAddress));
else
sentBytes = sendto(s, &buf[dataPtr], len, 0, (SOCKADDR*) &m_remoteAddress, sizeof(m_remoteAddress));
.
.
.snip
except it fails with error WSAEINVAL.
if I change the address to match the multicast address it still fails.
does anyone know what could be the problem?
Alistair
-- modified at 10:28 Thursday 3rd August, 2006
|
|
|
|
|
For extra info, this is compiled into a plain WIN32 MFC app on XP, with an eye to put it on a CE device, but my problem is firstly in the Full WIN32 environment, on VS2005 and Win XP
Thanks
-- modified at 11:08 Thursday 3rd August, 2006
|
|
|
|
|
I seem to have resolved this issue:
I was using a port of 6666 and the bind wasn't failing, but the send was.
once changed to 8190 everything worked a treat.
now my CE device NIC seems to be deaf on joined multicast channels
Alistair
|
|
|
|
|
Hi to all,
as we can declare an array as
int arr[3] = {1,2,3};
But if I want to declare this array in as a Member Variable of class I can't do as above, then how I should assign values to array (as above) in constructor?
(consider if array size is more)
Thanks & Best Regards,
Aniket Salunkhe
-- modified at 14:43 Thursday 3rd August, 2006
|
|
|
|
|
Like:
class myclass
{
myclass()
{
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
}
int arr[3];
};
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
what if Array Size is larger?
|
|
|
|
|
Aniket Salunkhe wrote: what if Array Size is larger?
What if?
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Let array,
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; How to declare this in the class?
But if I want to declare this array in as a Member Variable of class I can't do as above, then how I should assign values to array (as above) in constructor?
(array size can be more)
|
|
|
|
|
Like:
class myclass
{
myclass()
{
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
...
arr[9] = 10;
}
int arr[10];
};
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
There are a few ways to do it. You just can't assign values to member variables when you declare them in a class. Placing the initialization in the constructor (or having the constructor call an function to initialize your data) is the most straight-forward way to accomplish this.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
what should I do if array size in more?
|
|
|
|
|
Use a class, preferably a vector or the boost/tr1's array template.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
can you explain it with example?
plz.
|
|
|
|
|
class MyClass
{
public:
MyClass()
{
for (int i = 0; i < 10; ++i)
{
m_SomeInts.push_back(i);
}
}
private:
std::vector<int> m_SomeInts;
};
You should read up on STL and/or MFC (which has similar data types) for more information.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
I am developing a VC++ program ...
(so it is right post for the forum).
I am confused by 0.1 inch.
is it 1/10 inch or 1/8 inch?
|
|
|
|
|
.1 = 1/10
why would you think it's 1/8 inch ?
Why donchoo take a peekchur mayn?
OK, cleeeeek
|
|
|
|
|
Oh, those anglo-saxon units... You can never be sure... ;P
Ovidiu Cucu
Microsoft MVP - Visual C++
|
|
|
|
|
at first, i thought same as u, but got confused by some docs.
see, Ovidiu Cucu is confused also.
|
|
|
|
|
Well, I was joking.
I can tell you for sure 1"(inch) is 2.54cm and 0.1inch is 1/10 inch, i.e. 2.54mm.
Ovidiu Cucu
Microsoft MVP - Visual C++
|
|
|
|
|
I think it means you must purchase a VERY large pickup truck
Any sufficiently gross incompetence is nearly indistinguishable from malice.
|
|
|
|
|
Hi all,
I need to know if there's a way to put
a dialog as a data member of a class and,
if it's possible, how.
Thanx in advance,
Desmo16.
|
|
|
|
|
Yes, and yes. It is no different than declaring any other data member (say, an int , for example). You just have to make sure that if your dialog class needs arguments passed to its constructor that you handle that appropriately.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
well, it's great, but i don't understand what should i write in the class.
If for example my dialog's idd is IDD_SORGENTE1
in the class should i write:
public:
IDD_SORGENTE1 varname;
or what else ?
In other words i don't know the datatype of a dialog and its name
|
|
|
|
|
Are you wanting something like:
#include "MyDialog.h"
class myclass
{
CMyDialog dlg;
};
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|