gpt4 book ai didi

sockets - 非阻塞套接字-如何检查连接是否成功?

转载 作者:行者123 更新时间:2023-12-03 11:52:03 32 4
gpt4 key购买 nike

正确设置了非阻塞套接字后,请执行以下操作以进行连接:

  • 调用套接字上的connect。
  • 如果返回0,则表明我已经连接,否则,请检查errno。
  • 如果errno不是EINPROGRESS,则存在错误。
  • 如果errnoEINPROGRESS我可以通过以下方式轮询连接状态:
    select_status = sock_select(FD_SETSIZE, NULL, &file_descriptor_set, NULL, &timeout);
    如果是select_status > 0,则检查FD_ISSET是否设置了文件描述符。

  • 那是对的吗?我应该检查 fd_write而不是 fd_read吗?选择后应该叫 getsockopt吗?有什么争论?

    我找不到需要做什么的明确解释。

    我确实连接了,但是我的程序没有正确报告它,所以我使用了 select错误,或者是因为我没有检查 getsockopt

    是什么告诉我建立了连接?

    最佳答案

    1. Call connect on the socket.
    2. If it returns 0, I have already connected, if not, check errno.
    3. If errno is not EINPROGRESS there is an error.


    以上所有内容都是正确的(Windows除外,您需要检查WSAEWOULDBLOCK而不是EINPROGRESS)。

    1. if errno is EINPROGRESS I can poll the connect status by: select_status = sock_select(FD_SETSIZE, NULL, &file_descriptor_set, NULL, &timeout); if select_status > 0 then check with FD_ISSET if the file descriptor is set.


    正确(假设sock_select()与select()是相同的东西),不同之处在于FD_SETSIZE应该是您正在观看的所有文件描述符值的最大值加1。

    Is that correct? And should I check for fd_write not fd_read?



    正确的。

    What tells me that the connection was made?



    异步连接操作完成后,select()将返回,并且FD_ISSET(theSocket,&writeSet)将返回true。

    发生这种情况时,您需要确定连接尝试是成功还是失败。这是我为此使用的功能:
    // Returns true if the async connection on (fd) is connected; false if it failed
    bool DidTheAsyncTCPConnectionSucceed(int fd)
    {
    struct sockaddr_in junk;
    socklen_t length = sizeof(junk);
    memset(&junk, 0, sizeof(junk));
    return (getpeername(fd, (struct sockaddr *)&junk, &length) == 0);
    }

    如果返回true,则说明您的套接字已连接并可以正常使用。如果返回false,则异步连接失败,您应该关闭套接字并以某种方式处理该失败。

    (同样,在Windows下,行为略有不同;在Windows下,如上所述,获得有关连接成功的通知的工作原理,但是如果您想获得有关连接失败的通知,则需要将exception-fd-set设置为在Windows下,当异步TCP连接失败时,FD_ISSET(fd,&exceptionSet)会通知您)。

    关于sockets - 非阻塞套接字-如何检查连接是否成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28481993/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com