Commit fbb721be authored by jan.koester's avatar jan.koester
Browse files

new copy function

parent 196e0007
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -53,15 +53,16 @@
std::atomic<int> netplus::socket::_InitCount(0);

netplus::socket::socket(){
    _SocketInfo=(ULONG_PTR)malloc(ADDRMAXSIZE);
    _SocketInfoLen=ADDRMAXSIZE;
    memset((void*)_SocketInfo,0,ADDRMAXSIZE);
    _SocketInfo=(ULONG_PTR)malloc(sizeof(struct addrinfo));
    _SocketInfoLen=sizeof(struct addrinfo);
    memset((void*)_SocketInfo,0,sizeof(struct addrinfo));
    _Type=-1;
    ++_InitCount;
}

netplus::socket::~socket(){
    --_InitCount;
    free(((struct addrinfo*)_SocketInfo)->ai_addr);
    free((void*)_SocketInfo);
}

@@ -103,6 +104,17 @@ void netplus::socket::setTimeout(int sec){
    }
}

void netplus::socket::copyAddrInfo(ULONG_PTR *dest, ULONG_PTR src){
        memcpy((void*)*(dest),(void*)src,sizeof(struct addrinfo));
        ((struct addrinfo*)*(struct addrinfo**)dest)->ai_addr=(struct sockaddr*)malloc(((struct addrinfo*)src)->ai_addrlen);
        memcpy((void*)((struct addrinfo*)*(struct addrinfo**)dest)->ai_addr,
               (void*)((struct addrinfo*)src)->ai_addr,
               ((struct addrinfo*)*(struct addrinfo**)dest)->ai_addrlen
        );
        ((struct addrinfo*)*(struct addrinfo**)dest)->ai_addrlen=((struct addrinfo*)src)->ai_addrlen;
}


SOCKET netplus::socket::fd() {
    return _Socket;
}
+4 −9
Original line number Diff line number Diff line
@@ -103,10 +103,7 @@ netplus::tcp::tcp(const char* addr, int port,int maxconnections,int sockopts) :
                           rp->ai_protocol);
        if (_Socket == -1)
            continue;
        memcpy((void*)_SocketInfo,rp,sizeof(hints));
        ((struct addrinfo*)_SocketInfo)->ai_next=nullptr;
        _SocketInfoLen= sizeof(hints);

        copyAddrInfo(&_SocketInfo,(ULONG_PTR)rp);
        break;
    }

@@ -153,9 +150,8 @@ int netplus::tcp::getMaxconnections(){

void netplus::tcp::accept(socket *csock){
    NetException exception;
    struct sockaddr myaddr;
    socklen_t myaddrlen=sizeof(myaddr);
    *csock=::accept(_Socket,(struct sockaddr *)&myaddr,&myaddrlen);

    *csock=::accept(_Socket,((struct addrinfo *)(csock->_SocketInfo))->ai_addr,&((struct addrinfo *)(csock->_SocketInfo))->ai_addrlen);
    if(csock->_Socket<0){
        int etype=NetException::Error;
        if(errno==EAGAIN)
@@ -166,7 +162,6 @@ void netplus::tcp::accept(socket *csock){
        exception[etype] << "Can't accept on Socket: " << errstr;
        throw exception;
    }
    memcpy((void*)csock->_SocketInfo,(void*)_SocketInfo,sizeof(struct addrinfo));
}

void netplus::tcp::bind(){
@@ -245,7 +240,7 @@ size_t netplus::tcp::recvData(socket *csock, void* data, unsigned long size,int
void netplus::tcp::connect(socket *ssock){
    NetException exception;

    ((struct addrinfo*)_SocketInfo)->ai_family=((struct addrinfo*)ssock->_SocketInfo)->ai_family;
    copyAddrInfo(&_SocketInfo,ssock->_SocketInfo);

    if( (_Socket=::socket(((struct addrinfo*)_SocketInfo)->ai_family,SOCK_STREAM,0) ) < 0 ){
        NetException exception;
+5 −8
Original line number Diff line number Diff line
@@ -103,9 +103,7 @@ netplus::udp::udp(const char* addr, int port,int maxconnections,int sockopts) :
                           rp->ai_protocol);
        if (_Socket == -1)
            continue;
        memcpy((void*)_SocketInfo,rp,sizeof(hints));
        ((struct addrinfo*)_SocketInfo)->ai_next=nullptr;
        _SocketInfoLen=sizeof(rp);
        copyAddrInfo(&_SocketInfo,(ULONG_PTR)rp);
        break;
    }

@@ -152,9 +150,8 @@ int netplus::udp::getMaxconnections(){

void netplus::udp::accept(socket *csock){
    NetException exception;
    struct sockaddr myaddr;
    socklen_t myaddrlen=sizeof(myaddr);
    *csock=::accept(_Socket,(struct sockaddr *)&myaddr,&myaddrlen);

    *csock=::accept(_Socket,((struct addrinfo *)(csock->_SocketInfo))->ai_addr,&((struct addrinfo *)(csock->_SocketInfo))->ai_addrlen);
    if(csock->_Socket<0){
        int etype=NetException::Error;
        if(errno==EAGAIN)
@@ -165,7 +162,7 @@ void netplus::udp::accept(socket *csock){
        exception[etype] << "Can't accept on Socket: " << errstr;
        throw exception;
    }
    memcpy((void*)csock->_SocketInfo,(void*)_SocketInfo,sizeof(struct addrinfo));

}

void netplus::udp::bind(){
@@ -240,7 +237,7 @@ size_t netplus::udp::recvData(socket *csock, void* data, unsigned long size,int
void netplus::udp::connect(socket *ssock){
    NetException exception;

    ((struct addrinfo*)_SocketInfo)->ai_family=((struct addrinfo*)ssock->_SocketInfo)->ai_family;
    copyAddrInfo(&_SocketInfo,ssock->_SocketInfo);

    if( (_Socket=::socket(((struct addrinfo*)_SocketInfo)->ai_family,SOCK_DGRAM,0) ) < 0 ){
        NetException exception;
+2 −2
Original line number Diff line number Diff line
@@ -40,8 +40,6 @@ typedef unsigned long ULONG_PTR;
#include <WinSock2.h>
#endif

#define ADDRMAXSIZE 512

namespace netplus {
        enum sockettype {TCP=0,UDP=1,SSL=2};

@@ -76,6 +74,8 @@ namespace netplus {
            int                      _Type;
            ULONG_PTR                _Extension;
            static std::atomic<int>  _InitCount;
        protected:
            void copyAddrInfo(ULONG_PTR *dest,ULONG_PTR src);
        };
        
        class tcp : public socket{
+10 −0
Original line number Diff line number Diff line
@@ -83,3 +83,13 @@ void netplus::socket::setnonblocking(){
SOCKET netplus::socket::fd() {
    return _Socket;
}

void netplus::socket::copyAddrInfo(ULONG_PTR *dest, ULONG_PTR src){
        memcpy((void*)*(dest),(void*)src,sizeof(struct addrinfo));
        ((struct addrinfo*)*(struct addrinfo**)dest)->ai_addr=(struct sockaddr*)malloc(((struct addrinfo*)src)->ai_addrlen);
        memcpy((void*)((struct addrinfo*)*(struct addrinfo**)dest)->ai_addr,
               (void*)((struct addrinfo*)src)->ai_addr,
               ((struct addrinfo*)*(struct addrinfo**)dest)->ai_addrlen
        );
        ((struct addrinfo*)*(struct addrinfo**)dest)->ai_addrlen=((struct addrinfo*)src)->ai_addrlen;
}
Loading