C-如何在Windows中退出blocking connect()调用



有没有办法退出Windows中的connect()封锁?

请注意,我不想切换到非阻滞插座。

根据MSDN连接页面:

note 发出阻止winsock呼叫时,例如 connect ,WinSock可能需要等待网络事件才能完成。在这种情况下,Winsock执行了可警报的等待,可以通过安排在同一线程上的异步过程调用(APC)中断。在APC中发出另一个阻止Winsock的电话,该呼叫中断了同一线程中正在进行的阻止Winsock电话会导致不确定的行为,并且Winsock客户绝不会尝试。

因此,如果要取消connect调用,则必须从另一个线程进行操作:

/* apc callback */
VOID CALLBACK apc( _In_ ULONG_PTR data)
{
    /* warning, some synchronization should be added here*/
    printf("connect canceled by APCn");
}
/* second thread code */
DWORD WINAPI cancel_thread_function(void* main_thread_handle)
{       
    /* wait 500 ms*/
    Sleep(500);
    if (test_if_connect_is_still_pending())
    {
        /* cancel connect */
        QueueUserAPC(apc, (HANDLE)main_thread_handle, (ULONG_PTR) NULL);
    }
    return 0;
}

/* The thread in which is executed the connect call */
HANDLE mainThread;
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &mainThread, 0, TRUE, DUPLICATE_SAME_ACCESS);
/* create cancelation thread */
CreateThread(NULL, 0, cancel_thread_function, , 0, NULL);
/* Warning: I should close the handles... */
connect(...);

imo,EJP解决方案是最好的(非阻滞connect,并使用select进行测试)。

最新更新