Example #1
0
static int net_getaddrinfo(Value *vret, Value *v, RefNode *node)
{
    struct addrinfo *res = NULL;
    struct addrinfo *ai;
    RefArray *ra;
    RefStr *rs = Value_vp(v[1]);
    int err;

    if (str_has0(rs->c, rs->size)) {
        fs->throw_errorf(fs->mod_io, "SocketError", "No address found");
        return FALSE;
    }

    err = getaddrinfo_sub(&res, rs->c, NULL, 0);
    if (err != 0) {
        throw_socket_error(err);
        return FALSE;
    }
    ra = fs->refarray_new(0);
    *vret = vp_Value(ra);

    for (ai = res; ai != NULL; ai = ai->ai_next) {
        Value *vt = fs->refarray_push(ra);
        *vt = vp_Value(new_refsockaddr(ai->ai_addr, FALSE));
    }
    freeaddrinfo(res);

    return TRUE;
}
Example #2
0
/**
@fn void check_timeout_and_resend_data()
@detail 检查超时并重发数据
@param	void
@return void
@note
*/
void line_socket::check_timeout_and_resend_data()
{
    SOCKET_PACKAGE_SENT_PTR package = NULL;
    std::list<SOCKET_PACKAGE_SENT_PTR>::iterator itr;
    std::list<SOCKET_PACKAGE_SENT_PTR> tmp_queue;

    sent_pack_queue_lock_.Lock();
    itr = sent_pack_queue_.begin();
    while( itr != sent_pack_queue_.end()) {
        package = *itr;
        if(package->counter_sent_ < MAX_RESEND_COUNTER) {
            if(package->time_counter_ < MAX_TIME_COUNTER) {
                ++package->time_counter_;
            }
            else {
                tmp_queue.push_back(package);
                itr = sent_pack_queue_.erase(itr);
                continue;
            }
        }
        else {
            if(package->cmd_ == CmdSetHeartBeat) {
                sent_pack_queue_lock_.Unlock();
                throw_socket_error(SOCKET_CLOSED);
                Close();
                return;
            }
            else {
                sent_pack_queue_.erase(itr);
                throw_socket_error(SOCKET_RESEND_ERROR);
                break;
            }
        }
        ++itr;
    }
    sent_pack_queue_lock_.Unlock();

    for(itr = tmp_queue.begin(); itr != tmp_queue.end(); ++itr) {
        package = *itr;
        push_back_wait_sending_queue(package);
    }
}
Example #3
0
static int ipaddrrange_new_sub(Value *vret, const char *ipaddr, const char *mask)
{
    RefSockAddr *rsa = cstr_to_ipaddr(ipaddr, TRUE);

    if (rsa == NULL) {
        return FALSE;
    }
    if (mask == NULL || mask[0] == '\0') {
        rsa->mask_bits = 128;
    } else if (is_all_digit(mask)) {
        long bits;
        errno = 0;
        bits = strtol(mask, NULL, 10);
        if (errno == 0 && bits >= 0) {
            rsa->mask_bits = bits;
        }
    } else {
        struct addrinfo *ai = NULL;
        int err = getaddrinfo_sub(&ai, mask, NULL, AI_NUMERICHOST);
        if (err != 0) {
            throw_socket_error(err);
            return FALSE;
        }
        if (ai != NULL) {
            rsa->mask_bits = get_mask_bit_count(sockaddr_bytes(ai->ai_addr), sockaddr_bytes_count(ai->ai_addr));
        } else {
            fs->throw_errorf(fs->mod_io, "SocketError", "No address found");
            return FALSE;
        }
        freeaddrinfo(ai);
    }

    {
        int max_bits = sockaddr_bytes_count(rsa->addr) * 8;
        if (rsa->mask_bits > max_bits) {
            rsa->mask_bits = max_bits;
        }
    }

    *vret = vp_Value(rsa);
    return TRUE;
}
Example #4
0
static RefSockAddr *cstr_to_ipaddr(const char *hostname, int is_range)
{
    RefSockAddr *rsa = NULL;
    struct addrinfo *ai = NULL;
    int err = getaddrinfo_sub(&ai, hostname, NULL, AI_NUMERICHOST);

    if (err != 0) {
        throw_socket_error(err);
        return NULL;
    }
    if (ai != NULL) {
        rsa = new_refsockaddr(ai->ai_addr, is_range);
    } else {
        fs->throw_errorf(fs->mod_io, "SocketError", "No address found");
        return NULL;
    }
    freeaddrinfo(ai);

    return rsa;
}
Example #5
0
/**
@fn void OnReceive(int nErrorCode)
@detail 继承自CSocket
@note
*/
void line_socket::OnReceive(int nErrorCode)
{
    int size = 0;
    char frame_head[4] = {0x0};
    int length = 0x0;

    frame_head[0] = FrameHead1;
    frame_head[1] = FrameHead2;
    frame_head[2] = FrameHead3;
    frame_head[3] = FrameHead4;

    if(recv_package_.status_ == HEAD_RECV)
        length = sizeof(frame_head);//CommFrame_Struct::m_cFrameHead
    else if(recv_package_.status_ == LENGTH_RECV)
        length = sizeof(recv_package_.length_);//CommFrame_Struct::m_usFrameLength
    else if(recv_package_.status_ == DATA_RECV)
        length = recv_package_.length_;//CommFrame_Struct::m_usFrameLength

    size = Receive(recv_package_.pack_ + recv_package_.size_, length);
    if(size == SOCKET_ERROR) {
        if(WSAGetLastError() != WSAEWOULDBLOCK)//读取错误,将通知主框架,将停止程序socket,重连
            throw_socket_error(size);
    }
    else if(size == 0) { //没有数据
        throw_socket_error(SOCKET_CLOSED);
        Close();
    }
    else if((size + recv_package_.size_) < length) { //读取小于数据包开始标志大小
        recv_package_.size_ += size;
    }
    else { //得到包头标志大小相同的数据
        recv_package_.size_ += size;
        recv_package_.pack_[recv_package_.size_] = 0x0;
        switch(recv_package_.status_) {
        case HEAD_RECV://得到数据包头
            recv_package_.size_ = 0x0;
            if(recv_package_.pack_[0] == frame_head[0] &&
                    recv_package_.pack_[1] == frame_head[1] &&
                    recv_package_.pack_[2] == frame_head[2] &&
                    recv_package_.pack_[3] == frame_head[3] ) { //得到包头标志
                recv_package_.status_ = LENGTH_RECV;
                CopyMemory(recv_package_.head_, recv_package_.pack_, sizeof(recv_package_.head_));
            }
            break;
        case LENGTH_RECV://得到数据包长度
            recv_package_.size_ = 0x0;
            CopyMemory(&recv_package_.length_, recv_package_.pack_ , sizeof(recv_package_.length_));
            if(recv_package_.length_ > FrameSizeLimit) {
                recv_package_.status_ = HEAD_RECV;
            }
            else {
                recv_package_.status_ = DATA_RECV;
            }
            break;
        case DATA_RECV://得到数据包
            if(static_cast<unsigned char>(recv_package_.pack_[recv_package_.size_ - 1]) == FrameTail) { //包尾标志正确,放入到发送队列中
                analyze_package_and_push_recv_queue(&recv_package_);
                recv_package_.size_ = 0x0;
                recv_package_.status_ = HEAD_RECV;
            }
            else { //包尾标志错误
                normalize_package_and_push_recv_queue(&recv_package_);
            }
            break;
        }
    }
    CAsyncSocket::OnReceive(nErrorCode);
}