抱歉我的问题描述不当。
我的程序所做的是连接服务器,发送一些数据和关闭连接。我将代码简化如下:
Set Identity_Insert [TableName] On
-- --------------------------------------------
Insert TableName (pkCol, [OtherColumns])
Values(pkValue, [OtherValues])
-- ---- Don't forget to turn it back off ------
Set Identity_Insert [TableName] Off
在发现导致通信关闭的RST之前,服务器仅接收到部分数据。
我编写了一个模拟服务器程序来接受连接并接收数据,但模拟器可以获取所有数据。因为我无法访问服务器的源代码,所以我不知道是否有错误。有没有办法可以通过在客户端添加一些代码来避免此错误,或者我可以证明服务器程序中存在错误吗?
设置套接字的逗留选项可以修复错误。但是我需要为延迟时间的值给出一个神奇的数字。
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(s, (const sockaddr*)&dstAddr, sizeof(dstAddr));
send(s, (const char*)pBuffer, fileLen, 0);
shutdown(s, SD_SEND);
closesocket(s);
WSACleanup();
答案 0 :(得分:1)
WSASend在实际向设备发送数据之前返回
正确。
我创建了一个非阻塞套接字,并尝试将数据发送到服务器。
//Including in layout
<net.rimoto.intlphoneinput.IntlPhoneInput
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_phone_input" />
不,你没有。您创建了一个重叠的I / O套接字。
执行后,returnValue为SOCKET_ERROR,WSAGetLastError()返回WSA_IO_PENDING。然后我调用WSAWaitForMultipleEvents来等待事件被设置。在它返回WSA_WAIT_EVENT_0后,我调用WSAGetOverlappedResult来获取实际发送的数据长度,它与我发送的值相同。
所以所有数据都被传输到套接字发送缓冲区。
我先调用WSASocket,然后多次调用WSASend / WSAWaitForMultipleEvents / WSAGetOverlappedResult来发送一堆数据,最后调用closesocket。
所以在该过程结束时,所有数据和关闭都已转移到套接字发送缓冲区。
但服务器无法接收所有数据,我使用Wireshark查看tcp数据包,发现客户端在发送所有数据包之前发送了RST。
这可能是出于多种原因,如果没有看到某些代码,这些原因都无法确定。
如果我在调用closesocket之前睡了1分钟,那么服务器就会收到所有数据。
这又取决于您的代码中发生了什么。
在将数据实际发送到服务器之前,似乎返回了WSASend / WSAWaitForMultipleEvents / WSAGetOverlappedResult。
正确。
数据保存在缓冲区中,等待发送。
正确。
当我打电话给closesocket时,通讯被关闭了。
正确。
他们并没有像我期望的那样工作。
所以你的期望是错误的。
我出了什么问题?此问题仅发生在特定PC中,应用程序在其他PC中运行良好。
没有看到一些代码就无法回答。发出RST的通常原因是对等方已将数据写入您已关闭的连接:换句话说,应用程序协议错误;但还有其他可能性。