问题标签 [closesocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1060 浏览

c++ - WinSock closesocket() call takes one second on some computers

This call should return after only a very short time, but on some machines it inexplicably takes very close to 1 second. Has anyone seen this issue. I am using the loopback address so the network should be out of the picture.

0 投票
3 回答
34192 浏览

sockets - recv() 返回 0

我有一个非常烦人的问题,我在其他论坛上多次发现,但我找不到合适的解决方案。问题是 recv() 在连接的最后几个字节上返回 0。以下是一些背景信息。

  • 两个(客户端/服务器)应用程序都在同一台机器上运行。
  • 两个(客户端/服务器)套接字都是非阻塞的
  • 传输的数据大小为 53 字节。
  • 执行最后一次 send()/recv() 时,(客户端/服务器)都调用 shutdown 和 closesocket。
  • 我也试过 SO_LINGER 和 10 秒,也没有成功

我多次调用 send() (小块),从客户端传输了 53 个字节。服务器多次调用 recv()(4 字节请求)并读取 49 字节,然后返回 0(54 字节 - 49 字节,因此缺少 4 字节)。

MSDN 和一些论坛为非阻塞套接字编写:

  • recv() 在错误时肯定返回 < 0 并且设置了 errno / WSAGetLastError
  • 当对方关闭连接时,recv() 肯定会返回 = 0
  • 读取数据时,recv() 肯定返回 > 0

MSDN 还说:

使用带有 SD_SEND 或 SD_BOTH 的 closesocket 或关闭函数会导致在控制通道上发送 RELEASE 信号。由于 ATM 使用单独的信号和数据通道,RELEASE 信号可能会在最后一个数据到达其目的地之前到达远端,从而导致该数据丢失。一种可能的解决方案是在最后发送的数据与 ATM 套接字的 closesocket 或关闭函数调用之间设置足够的延迟。

这在 recv() 和 send() 的例子中被认为是:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms740121 (v=vs.85).aspx

但是仍然没有成功,在收到 49 字节后,我仍然在 10% 的连接中得到一些中断,90% 的连接成功。有任何想法吗?谢谢。

0 投票
2 回答
3601 浏览

java - 打开的套接字和连接的套接字有什么区别?

JavaSocket类有两个方法isClosedisConnected分别检查套接字是关闭还是连接。我想知道仅打开的 TCP 套接字和打开并连接的 TCP 套接字之间有什么区别,以及这与 UDP 有何不同。

0 投票
0 回答
583 浏览

iocp - IOCP 关闭套接字并删除每个 io 相关的缓冲区

尝试停止 IOCP 工作线程并关闭套接字和相关的每个 io 数据 这是基于引用计数,当引用计数达到 0 时,关闭套接字并删除缓冲区。下面是 IOCP 工作线程的骨架。当我想停止 IO 时,调用 'FFT_stop_session' 函数。这只是 'PostQueuedCompletion.." 这种方式似乎有效。但崩溃时有发生..错误消息如下所示..

但我不明白为什么会发生双重免费???

0 投票
1 回答
1017 浏览

c++ - Windows 中对套接字的 closesocket() 调用需要 20 秒

我正在尝试从 closesocket() 关闭 Windows 上的套接字,但需要 20 秒才能完成。起初我以为这是关于 linger 间隔,虽然我没有用 linger 的 setsockopt 设置任何东西,所以我添加了这样的代码:

但它仍然没有帮助。

有任何想法吗?我只想关闭连接,不管是优雅还是流产,只想尽快关闭它。

PS它需要20秒。

此代码打印 option1 = 0 和 option2 = 1,因此它确实正确设置了 option。

另外,从wireshark观察,它在整个延迟开始时发送RST。

另外,closesocket() 返回 0。

PS 我设置了 SO_REUSADDR,会不会是它的原因?

0 投票
0 回答
167 浏览

c - 确定 TCP 连接在 C 中真正关闭的时刻

我只需要在 TCP 连接完全关闭后执行一些操作,也就是说 - 所有数据段以及完成例程(FIN-ACK 或 RST)都已执行并完成,并且不会有任何数据包在电线上发送

由于closesocket()不是同步的并且可以在连接和套接字完全关闭之前返回,我使用该SO_LINGER选项来获取关闭的时刻。

根据 MSDN 中关于 closesocket 的说明,以及我的套接字是非阻塞的(因此是异步的)这一事实,我编写了以下代码:

但是,closesocket 调用返回零(成功;而不是进入循环),我在 Wireshark 中看到我的最终打印是在所有数据包发送之前调用的,所以 - 看起来 linger 不起作用。

顺便说一句,我用来打开和连接异步套接字的函数是socket()WSAIoctl()以及它的lpfnConnectEx()回调。

在 TCP 连接完全完成之前,徘徊的 closesocket 返回的原因是什么?有解决办法吗?

0 投票
0 回答
54 浏览

android - 套接字 c-sharp 发送数据而无需关闭和关闭,如 java 中的 BufferedWriter.flush

我在不关闭套接字时无法接收消息并且我使用 NetworkStream 但在套接字未关闭时不发送数据我的代码服务器 c#:

我的客户安卓:

我厌倦了阅读问题并且找不到答案请帮助我

0 投票
1 回答
446 浏览

tcp - TCP close() 是否确保所有数据都传递给接收方

我正在实现一个简单的代理应用程序,我总是从一端接收数据并发送到另一端。

在这种情况下,一旦我确定我已完成接收来自传入支路的所有数据,我可以直接close( )调用而不调用shutdown( )吗?如果我这样做,是否会close( )确保所有数据都在传出段上传递到目的地并由目的地的应用程序接收?

或者在这种情况下,我是否必须在启动关闭之前启动关闭?

0 投票
0 回答
260 浏览

sockets - 如果 closesocket 因 WSAENETDOWN 而失败,我该怎么办?

显然,每当closesocket函数失败时WSAENETDOWN,“网络子系统已失败”。但这究竟是什么意思?什么时候发生?如果确实发生了,套接字描述符是否仍然关闭?我应该如何处理?

关于我的第一个问题,Windows Sockets Error Codes页面说这WSAENETDOWN意味着

网络已关闭。

套接字操作遇到死网络。这可能表示网络系统(即运行 Windows Sockets DLL 的协议栈)、网络接口或本地网络本身存在严重故障。

但这也对我没有帮助。

请注意,POSIXENETDOWN仅指定用于connect, send, sendto, sendmsg, write, 而不是close. Winsock 对应物更为普遍。

0 投票
1 回答
733 浏览

c++ - closesocket() 未完成 IOCP 的挂起操作

我目前正在使用 C++ 开发服务器应用程序。我的主要灵感是这些例子:

Windows SDK IOCP 示例

I/O 完成端口 IPv4/IPv6 服务器程序示例

我的应用程序与这些(socketobj、packageobj、...)非常相似。

一般来说,我的应用程序运行没有问题。唯一仍然给我带来麻烦的是半开连接。

我的策略是:我在一段时间内检查每个连接的客户端并计算一个“空闲计数器”。如果发生一次完成,我会重置此计时器。如果空闲计数器太高,我设置一个布尔值以防止其他线程发布操作,然后调用closesocket().

我的假设是,现在套接字已关闭,待处理的操作将完成(可能不是立即完成,而是在一段时间后)。这也是 MSDN 文档描述的行为(提示,第二段)。我需要这个,因为只有在完成所有操作之后才能释放资源。

长话短说:这对我来说不是这样。我用我的 testclient 应用程序和一些 cout 和断点调试做了一些测试,发现关闭套接字的挂起操作没有完成(即使在等待 10 分钟之后)。我也已经在 之前尝试过shutdown()调用closesocket(),并且都没有返回错误。

我究竟做错了什么?其他人也有遇到同样的状况吗?MSDN 文档有错吗?有哪些替代方案?

我目前正在考虑“逗留”功能,或者使用该CancelIoEx()功能明确取消每个操作

编辑:( 感谢您的回复)

昨天晚上我为每个 sockedobj 添加了一个链表来保存挂起操作的 per io obj。有了这个我尝试了这个CancelIOEx()功能。对于大多数操作,该函数返回 0 并GetLastError()返回ERROR_NOT_FOUND 。

那么在这种情况下释放每个 Io Obj 是否安全?

我还发现,当我在同一台机器上运行我的服务器应用程序和客户端应用程序时,这种情况发生得更频繁。有时会发生服务器无法完成写入操作的情况。我认为这是因为客户端接收缓冲区已满。(客户端不会停止接收数据!)。

剪断的代码会尽快跟进。