|
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
|
|
|
|
|
You need to create a class for your dialog first. If you use the classwizard, it will do it for you. You can then do what David mentioned in his post.
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
|
|
|
|
|