Здравствуйте, Roman Odaisky, Вы писали:
RO>Так выкладывай.
Выкладываю. С указанием структуры. Есть каталог server. В нем лежит main.cpp. В каталоге server есть каталог include и в нем лежит socketClass.cpp — объявление класса Socket. В каталоге server есть также каталог src — в нем лежит socketClass.cpp — определение класса Socket. Для сборки этого в каталоге server лежит также файл Makefile. То есть структура такая:
server =>
include =>
socketClass.h
<=
src =>
socketClass.cpp
<=
main.cpp
Makefile
<=
Итак socketClass.h:
/*
******Socket******
Class, which contains IPv4 sockets
*/
#ifndef SOCKET_H_
#define SOCKET_H_
#include <sys/socket.h>
#include <netinet/in.h>
#include <string>
class Socket
{
public:
Socket();
Socket(int);
Socket(int, int);
~Socket();
int createSocket();
int bind();
int listen();
void accept(Socket*);
void setPort(int port) {this->port = port;};
void setBacklogSize(int backlog) {this->backlog = backlog;};
void showIp();
int getSocketDesk();
std::string getIp();
private:
int socketDesk;
int port;
int backlog;
sockaddr_in *factAddr; // This is the fact addr
sockaddr *usingAddr; // This is the automatic link to soclkladdr_in addr
socklen_t factAddrLen;
std::string ip;
bool toggleMemory();
void setDefaults();
};
#endif /*SOCKET_H_*/
Файл socketClass.cpp:
#include <socketClass.h>
#include <new>
#include <string>
#include <iostream>
#include <arpa/inet.h>
Socket::Socket()
{
toggleMemory();
setDefaults();
}
Socket::Socket(int port, int backlog)
{
toggleMemory();
this->port = port;
this->backlog = backlog;
try
{
createSocket();
bind();
listen();
}
catch(std::string xa)
{
std::cout << xa;
throw(xa);
}
}
bool Socket::toggleMemory()
{
try
{
factAddr = new sockaddr_in;
}
catch (std::bad_alloc xa)
{
throw(std::string("Cannot allocate memory!"));
return false;
}
usingAddr = (sockaddr*) factAddr;
factAddrLen = sizeof(*factAddr);
return true;
}
int Socket::createSocket()
{
socketDesk = ::socket(PF_INET, SOCK_STREAM, 0);
if(socketDesk < 0)
{
throw(std::string("Cannot create Socket"));
}
return true;
}
int Socket::bind()
{
factAddr->sin_family = AF_INET;
factAddr->sin_port = htons(port);
factAddr->sin_addr.s_addr = htonl(INADDR_ANY);
int result = ::bind(socketDesk, usingAddr, factAddrLen);
if(result)
{
throw(std::string("Cannot bind socket"));
}
else return true;
}
int Socket::listen()
{
if(::listen(socketDesk, backlog))
{
throw(std::string("Cannot listen port."));
return false;
}
else
return true;
}
int Socket::getSocketDesk()
{
return socketDesk;
}
void Socket::accept(Socket *parent)
{
if((this->socketDesk = ::accept(parent->getSocketDesk(), usingAddr, &factAddrLen)) < 0)
{
throw(std::string("Cannot accept incoming connection!"));
}
}
void Socket::setDefaults()
{
backlog = 5;
port = 8008;
}
std::string Socket::getIp()
{
char ipaddr[INET_ADDRSTRLEN];
const char *ipAddr = inet_ntop(AF_INET, &(factAddr->sin_addr), ipaddr, sizeof(ipaddr));
std::string *result = new std::string(ipAddr);
ip = *result;
return ip;
}
void Socket::showIp()
{
std::cout << ip << std::endl;
}
Socket::~Socket()
{
delete factAddr;
}
Файл main.cpp (который этот класс использует — создает сокет, ждест соединения, когда есть соединение, выводит ip адрес подсоеденившегося и отрубается)
#include <iostream>
#include <socketClass.h>
using namespace std;
int main()
{
Socket *sockPointer;
try{
Socket *socket1 = new Socket(8008, 16);
sockPointer = socket1;
}
catch(string error)
{
exit(1);
}
sockPointer->getIp();
sockPointer->showIp();
while(true)
{
Socket *newConn = new Socket();
newConn->accept(sockPointer);
newConn->getIp();
newConn->showIp();
close(newConn->getSocketDesk());
delete newConn;
break;
}
cout << "Hello, world!" << endl;
return 0;
}
А вот Makefile что бы это собрать. Для GNU Make ессною
includeMain = -Iinclude/
includeSrc = -I../include
server : serverClass.o
g++ -o server $(includeMain) main.cpp socketClass.o
serverClass.o :
g++ -c $(includeMain) src/socketClass.cpp