Re[2]: Просьба от новичка.
От: DiKeert  
Дата: 29.01.08 22:11
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.