Помогите разобраться с С++
Описание класса:
class myNet
{
public:
SOCKET sd;
struct sockaddr_in addr;
SOCKET s;
long rc;
SOCKADDR_IN _addr;
SOCKADDR_IN remoteAddr;
char buf[256];
bool CreateBroadcastServer(int port);
bool sendBroadcast();
};
Также имеем реализации функций класса myNet для UDP:
#include "network.h"
#include <stdio.h>
//нужно ли в программе указывать еще и SOCKET ?
bool myNet::CreateBroadcastServer(int port)
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
memset(buf,0,strlen(buf));
s=socket(PF_INET,SOCK_DGRAM,0);
if(s==INVALID_SOCKET)
{...}
char n=1;
rc = setsockopt(s,SOL_SOCKET,SO_BROADCAST,&n,sizeof(BOOL));
if (rc==SOCKET_ERROR)
{
printf("Error setting options %d\n",WSAGetLastError());
closesocket(s);
WSACleanup;
// exit(1);
}
_addr.sin_family=PF_INET;
_addr.sin_addr.s_addr = INADDR_BROADCAST;
_addr.sin_port=htons(port);
return true;
}
bool myNet::sendBroadcast()
{
rc=sendto(s,"Test Message Broadast",strlen("Test message"),0,(SOCKADDR*)&_addr,sizeof(SOCKADDR_IN));
if(rc==SOCKET_ERROR)
{ printf("Error send, error code: %d\n",WSAGetLastError());
rc=WSAGetLastError();
switch(rc)
{
case WSANOTINITIALISED: printf(" 1 "); break;
case WSAENETDOWN: printf(" 2 "); break;
case WSAEINTR: printf(" 3 "); break;
case WSAEINPROGRESS: printf(" 4 "); break;
case WSAENOTSOCK: printf(" 5 "); break;
case WSAEWOULDBLOCK: printf(" 6 "); break;
default: break;
}
}
closesocket(s);
WSACleanup;
return true;
}
Пишем две программы:
Первая запускается, но не отсылает ничего – говорит, что WSAENOTSOCK (при отсылке):
#include
// Указатель на класс. По идее можно и просто “myNet acceptServer;” – есть ли большая разница? Я второй сервер создаю точно также.
myNet * acceptServer=0;
int main()
{
//выделяем память под наш объект
myNet * acceptServer = new myNet;
//создаем сервер
acceptServer->CreateBroadcastServer(5002);
//пытаемся отправить слово..., но дает ошибку WSAENOTSOCK. В дебаггере видно, что все данные структуры SOCKADDR_IN не заполнены, ПОЧЕМУ???
while(1)
{
acceptServer->sendBroadcast();
}
return 0;
}
ВАРИАНТ, КОТОРЫЙ ВЫВАЛИВАЕТСЯ С ОШИБКОЙ ЧТЕНИЯ ПАМЯТИ при отсылке – также в дебаггере видно, что ничего не определено:
myNet * acceptServer=0;
void prerun()
{
myNet * acceptServer = new myNet;
acceptServer->CreateBroadcastServer(5002);
}
int main()
{
prerun();
acceptServer->sendBroadcast();
return 0;
}
Ошибок во время инициализации вроде как не вылазит никаких.
Может есть ссылки на статьи или главы книг, где можно понять, почему так??? Если не сложно, то буду благодарен за разъяснения. Заранее спасибо.