socket连接返回错误码

10035—WSAEWOULDBLOCK  
      资源暂时不可用。对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。比如说,在一个非暂停套接字上调用 connect,就会返回这个错误。因为连接请求不能立即执行。  

      10037—WSAEALREADY  
操作已完成。一般来说,在非锁定套接字上尝试已处于进程中的操作时,会产生这个错误。比如,在一个已处于连接进程的非锁定套接字上,再一次调用 connect 或 WSAConnect。另外,服务提供者处于执行回调函数(针对支持回调例程的 Winsock函数)的进程中时,也会出现这个错误。  
 
应用层socket接收数据:
     1、内核copy数据到socket接收缓冲区
     2、应用程序调用recv,copy socket接收缓冲数据到应用进程。
 
应用socket发送数据:
    1、应用调用send copy数据到socket发送缓冲区,
    2、内核维护socket缓冲区通过IP协议发出数据

 

连接对应关系:

注: accept 只是从内核取出可以已完成握手(建立连接)的队列中取出一个连接响应,表示应用层完成tcp连接。

10035处理->

部分解决方案1:

在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可
以设置connect()延时,直到accpet()被呼叫,本函数设置只有在非阻塞的过程中有显著的
作用,在阻塞的函数调用中作用不大)BOOL bAccept=TRUE;

setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bAccept,sizeof(BOOL));

部分解决方案2:

待续....


 

转载于:https://my.oschina.net/u/727148/blog/481418

### Socket 错误码 114 的含义 Socket 错误码 `114` 表示的是 `EINPROGRESS`,这是一个常见的非阻塞套接字操作中的错误代码。当尝试执行一个无法立即完成的操作时,会返回此错误代码[^1]。具体来说,在调用诸如 `connect()` 或其他涉及网络通信的函数时,如果该操作尚未完成而程序继续运行,则可能收到这个错误。 #### 非阻塞模式下的行为解释 在非阻塞模式下工作时,某些 socket 调用不会等待操作结束就会返回控制权给应用程序。例如,当你在一个设置为非阻塞状态的 socket 上发起连接请求 (`connect()`) 后,如果没有立刻建立成功,操作系统通常会报告 EINPROGRESS (即错误号 114),表明当前操作正在进行中而不是失败了[^2]。 为了处理这种情况并确认最终的结果如何,可以采用以下方法之一: - **轮询 select/poll**: 使用这些工具来监视文件描述符的状态变化直到它变为可写入状态(对于 connect 来说意味着已经准备好或者发生了某种类型的事件)。 ```python import socket, select sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(False) try: sock.connect(('example.com', 80)) except BlockingIOError as e: if e.errno != errno.EINPROGRESS: raise rlist, wlist, xlist = select.select([], [sock], [], timeout_value_in_seconds) if sock in wlist: # Connection established successfully or failed with an error that can be retrieved via getsockopt. else: # Handle the case where no event occurred within your specified time limit. ``` - **异步通知 epoll/kqueue**: 更高效的机制用于大量并发连接管理场景下替代简单的select循环方式实现更优性能表现的同时保持较低CPU占用率水平. 需要注意的是解决办法取决于实际应用场景以及所使用的编程环境等因素影响较大因此需灵活调整策略适应不同需求条件约束情况之下达到最佳效果平衡点位置所在之处才行得通才行啊亲~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值