非阻塞connect,错误码:EINPROGRESS

http://blog.youkuaiyun.com/benbendy1984/article/details/5773137当我们以非阻塞的方式来进行连接的时候,返回的结果如果是 -1,这并不代表这次连接发生了错误,如果它的返回结果是 EINPROGRESS,那么就代表连接还在进行中。 后面可以通过poll或者select来判断socket是否可写,如果可以写,说明连接完成了。



### lwIP 中 EINPROGRESS 错误码的含义 在 lwIP 网络协议栈中,`EINPROGRESS` 是一个标准的错误码,用于表示操作正在进行中,尚未完成。它通常出现在非阻塞模式下的套接字操作中[^1]。例如,当调用 `connect()` 函数连接到远程主机时,如果套接字处于非阻塞模式,则该函数可能不会立即完成连接过程,而是返回 `EINPROGRESS` 以通知调用者连接正在尝试建立,但尚未完成。 在 lwIP 的实现中,`EINPROGRESS` 的定义与 POSIX 标准兼容,其值通常为 `115`(具体值可能因平台而异)。这个错误码的意义在于告知应用程序开发者,当前的操作需要更多时间来完成,并且应该通过轮询或使用事件驱动的方式来检查操作的状态。 以下是一个简单的代码示例,展示如何处理非阻塞模式下返回 `EINPROGRESS` 的情况: ```c #include "lwip/sockets.h" #include "lwip/netdb.h" #include "lwip/err.h" int connect_with_einprogress(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { int err = connect(sockfd, addr, addrlen); if (err < 0) { int lwip_err = errno; if (lwip_err == EINPROGRESS) { // 连接正在尝试建立,需要等待 printf("Connection is in progress...\n"); return EINPROGRESS; } else { // 其他错误 printf("Connect error: %s\n", strerror(lwip_err)); return -1; } } // 连接成功 return 0; } ``` ### 注意事项 - 在非阻塞模式下,`EINPROGRESS` 是预期的行为,而不是真正的错误。 - 应用程序需要通过 `select()`、`poll()` 或其他机制来监控套接字的状态变化,以确定连接是否成功或失败[^1]。 - 如果套接字处于阻塞模式,则 `connect()` 函数会一直阻塞直到连接完成或超时,因此不会返回 `EINPROGRESS`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值