1

bufferevent_socket_connect 中にエラーが発生した場合に、イベント ハンドラーでピアのアドレスを出力する方法が見つかりませんでした。誰でも助けることができますか?

私が試したこと:

  1. 接続が確立されていないため、bufferevent_getfd() で getpeername() を使用すると失敗する

  2. イベント ハンドラの最後のパラメータでピアのアドレスを送信することも失敗します。これは、別のピアへの次の接続試行でこのポインタが変更されるためです。

コード例:

void eventcb(struct bufferevent *bev, short events, void *ptr)
{
    if (events & BEV_EVENT_ERROR)
    {
        // I whant to print peer's address on error in bufferevent_socket_connect
        bufferevent_free(bev);
    }
}

int main()
{
    ...
    struct sockaddr_storage obj;
    ...
    while(get_next_obj(obj))
    {
        evutil_socket_t sock = socket(obj.ss_family, SOCK_STREAM, 0);
        evutil_make_socket_nonblocking(sock);
        evutil_make_listen_socket_reuseable(sock);
        evutil_make_socket_closeonexec(sock);
        struct bufferevent *evbev = 
            bufferevent_socket_new(evbase, sock, 0);
        bufferevent_set_timeouts(evbev, &sec5, &sec5);
        bufferevent_setcb(evbev, readcb, NULL, eventcb, evbase);
        bufferevent_enable(evbev, EV_READ|EV_WRITE);
        bufferevent_write(evbev, some_data.data(), some_data_sz);
        if(bufferevent_socket_connect(evbev, (struct sockaddr *)&obj, sizeof(sockaddr_storage)) < 0) {
            continue;
        }
        ...
    }
    ...
}
4

0 に答える 0