- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 WinAPI 为套接字操作编写了 C++ 服务。客户端和服务之间的通信很简单,连接到服务后,客户端发送一些数据,服务立即发送响应。
服务端的主套接字(ListenSocket
)是这样创建的:
SOCKET ListenSocket = socket(pAddrResult->ai_family, pAddrResult->ai_socktype, pAddrResult->ai_protocol);
/* err checking */
/* Setting socket I/O mode to non-blocking */
u_long nonBlockingMode = 1;
opResult = ioctlsocket(ListenSocket, FIONBIO, &nonBlockingMode);
/* err checking */
主套接字上的选择-接受循环:
while(...)
{
if(select(0, &readSet, NULL, NULL, &timeout) == 1)
{
ClientSocket = accept(ListenSocket, NULL, NULL); // SOCKET type, declared in global scope.
/* err checking */
break;
}
}
中断循环后,服务开始从 ClientSocket
读取数据,然后服务在此套接字上发送响应:
int iSendResult = send(ClientSocket, (const char*) messageBuffer.getData(), messageBuffer.getSize(), 0);
/* err checking */
/* FIX sleep(50) */
int opResult = shutdown(ClientSocket, SD_BOTH);
/* err checking */
closesocket(ClientSocket);
在 closesocket()
过程返回到 select-accept 循环并等待另一个连接。
我的问题是,有时客户端收到的数据不足,并收到“连接已被远程主机关闭”的信息。经过调试和一些研究后,我在 MSDN 上发现了这个注释:
Using the closesocket or shutdown functions with SD_SEND or SD_BOTH results in a RELEASE signal being sent out on the control channel. Due to ATM's use of separate signal and data channels, it is possible that a RELEASE signal could reach the remote end before the last of the data reaches its destination, resulting in a loss of that data. One possible solutions is programming a sufficient delay between the last data sent and the closesocket or shutdown function calls for an ATM socket.
延迟你说微软? :( 好吧,我已经实现了短延迟 (/* FIX sleep(50) */
),问题消失了。
但这一点都不让我满意。我想删除这个 sleep()
并确保缓冲区在发送后被完全刷新并且我可以安全地 shutdown()
和 closesocket()
.
我试图让主套接字成为非阻塞的,希望 send()
会阻塞直到完成,但我错了 - 没有效果。
如果没有 sleep()
,我还能做些什么吗?
最佳答案
通常的方法是一个部分只发出一个 SD_SEND 关闭,然后对等点将以 0 长度读取结束并且能够关闭,因为通信 channel 上仍然没有任何东西。可以在其他 answer 上找到带有一些引用的稍微更详细的解释。我的。
关于c++ - shutdown() 和 closesocket() 在 SOCKET 上的 send() 之后不久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48326635/
如果我想从 1 个线程在服务器套接字上调用 closesocket() 是否安全,该线程与使用相同服务器套接字运行服务器的另一个线程分开? 最佳答案 调用本身是线程安全的,但实践不是。每当您解除分配其
这是我关闭套接字的方式: LINGER lingerStruct; lingerStruct.l_onoff = 1; lingerStruct.l_linger = 0; setsockopt(Cl
我在调用 closesocket() 时注意到一个奇怪的行为。如果我创建一个调用 recv() 的线程,则 closesocket() 将向另一端发送一个 RST 数据包。但是,如果我不创建接收线程,
因为我认为我可以通过阅读 MSDN 对 closesocket 的描述来自己回答这个问题,所以我想让一位有经验的人确认它,因为 MSDN 只是从我读过的内容中暗示它。 WSAENOBUFS 是缺少对已
这个调用应该在很短的时间后返回,但在某些机器上它莫名其妙地花费了接近 1 秒的时间。有没有人看到这个问题。我正在使用环回地址,因此网络应该不在画面中。 最佳答案 问题可能出在窗口套接字实现的某个地方。
我目前正在使用 C++ 开发服务器应用程序。我的主要灵感来自这些例子: Windows SDK IOCP Excample The I/O Completion Port IPv4/IPv6 Serv
我在生产服务器上遇到了一个奇怪的情况。 我们有一个用 C++ 编写的网络应用程序,它通过使用 IOCP 编写的 TCP 服务于用户请求。 两天前我们对 Windows 2012 R2 进行了更新(它安
在我的应用程序中,我在同一个套接字上调用了两次 shutdown 和 closesocket 函数。我知道这样做是不对的,我必须确保这些函数只被调用一次。但是,为什么这些调用中的任何一个在第二次调用时
我将尝试用几个例子来解释我的意思: socket() -> WSASocket() connect() -> WSAConnect() send() -> WSASend() sendto() ->
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在处理一个现有的 DLL,其中创建了一个 TCP 监听套接字,并设置为在出现故障时使用 SO_REUSEADDR 立即重新绑定(bind)到同一个套接字。然而,目前存在一个问题,即使在成功调用 c
我使用 WinAPI 为套接字操作编写了 C++ 服务。客户端和服务之间的通信很简单,连接到服务后,客户端发送一些数据,服务立即发送响应。 服务端的主套接字(ListenSocket)是这样创建的:
我是一名优秀的程序员,十分优秀!