当前位置: 首页 > 知识库问答 >
问题:

Windows7中具有非阻塞recv的C++TCP套接字

施琦
2023-03-14

另外,除了调用recv函数后检查WSAGetLastError的值之外,是否还有其他方法可以使用TCP套接字库检测网络断开?

多谢!

共有1个答案

鲁辉
2023-03-14

我会说Windows7在这里的表现是正确的,而XP在电缆拉扯时立即做出反应是错误的。TCP从一开始就具有高度的容错性,特别是允许电缆拉线或路由器中断而不中断现有的连接。

有没有别的办法[等]

检测TCP连接中断的最可靠方法是发送到它。在足够的缓冲、重试等之后,TCP将放弃发送,并向send()的调用方传递一个重置。但这需要一段时间和几个电话。

 类似资料:
  • 我正在使用TCP/IP套接字,我已经读过函数。因此,每当对等体断开连接时,recv按照文档返回0,但在windows上它不返回零,而是返回-1,并且中的值是我无法理解它为什么这样做。同样的代码在Linux中运行得非常好。

  • 问题内容: 为什么有人会喜欢阻止写而不是非阻止写?我的理解是,仅当您想确保写方法返回后,另一端获得了TCP数据包时,才希望阻止写操作,但是我什至不知道这是可能的。您将必须刷新,而刷新则必须刷新 底层操作系统的写套接字缓冲区 。那么,无阻塞套接字写是否有任何缺点?就性能而言,拥有较大的底层写套接字是否会缓冲一个不好的主意?我的理解是,底层套接字写缓冲区越小,当底层套接字缓冲区已满且isWritabl

  • 问题内容: 我想创建一个非阻塞连接。像这样: 为此,我使用了另一个线程,无限循环和Linux epoll。像这样(伪代码): 如果我先运行服务器,然后运行客户端,那么一切正常。如果我先运行客户端,请稍等一会儿,再运行服务器,然后客户端将无法连接。 我究竟做错了什么?也许可以做不同的事情? 问题答案: 您应该使用以下步骤进行异步连接: 用创建套接字 开始与 如果返回值既不是也不是,则中止并返回错误

  • 问题内容: 我正在尝试在Go中创建服务器和客户端,我已经设法与服务器和客户端进行通信。但是我的问题是,在golang中读取的TCP是非阻塞的。我想知道的是,golang中的读取是否有可能像C中的读取一样被阻塞。谢谢 编辑: 这是服务器的源代码: 和我的客户: 问题答案: 可以返回部分数据。从该文档,“如果某些数据是可用的,但不是LEN(P)个字节,读取常规返回什么是可用的,而不是等待更多。” 无论

  • 我正在编写一个需要向连接的远程主机发送数据的tcp服务器。我更希望套接字发送呼叫永远不要阻塞。为了方便起见,我使用了Socket。选择以标识可写套接字并使用Socket.Send写入这些套接字。插座。选择msdn文章状态: 如果您已经建立了连接,可写性意味着所有发送操作都将成功而不会阻塞。 我担心远程套接字没有主动耗尽缓冲区的情况,所述缓冲区填充,并且 tcp 推回我的服务器套接字。在这种情况下,

  • 我正在实现一个UNIX域套接字进程间通信代码,在试图从套接字读取时,我随机地碰到了这个错误--“errno 11:资源暂时不可用”。我使用MSG_PEEK从套接字读取字节数,并为接收缓冲区分配字节数,并读取实际数据。 套接字是一个阻塞套接字,我没有任何非阻塞的代码(总之,接受/读/写)。在阻塞套接字读取中,有什么可能导致这种情况的指针吗?在MSG_PEEK的手册页中,当socket标记为非阻塞时,