WSASend在实际向设备发送数据之前返回

时间:2016-03-03 09:41:47

标签: c++ tcp

抱歉我的问题描述不当。

我的程序所做的是连接服务器,发送一些数据和关闭连接。我将代码简化如下:

  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();

1 个答案:

答案 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的通常原因是对等方已将数据写入您已关闭的连接:换句话说,应用程序协议错误;但还有其他可能性。