TCP问题急求帮助在线等:send()成功,但是抓包工具抓不到包,服务端也没收到

luisszhou 2009-08-22 12:06:46
我的程序是Client,和服务端维持TCP长连接。现在碰到一个奇怪的问题:
send()提示成功(返回发送字节数,和预期一致,无异常抛出),但是在本机上抓不到相应发出的数据包,这是怎么回事?请高手看看。

send部分如下。

...
nBuf=128*1024;
i=setsockopt(m_hSocket, SOL_SOCKET,SO_SNDBUF, (char*)&nBuf, sizeof(nBuf));
nBuf=128*1024;
i=setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&nBuf, sizeof(nBuf));
...
FD_SET fd = {1, m_hSocket};
TIMEVAL tv = {nSecs, 0};
if(select(0, NULL, &fd, NULL, &tv) == 0)
{
throw new CBlockingSocketException("Send timeout");
}
int nBytesSent;
if((nBytesSent = send(m_hSocket, pch, nSize, 0)) == SOCKET_ERROR)
{
throw new CBlockingSocketException("Send");
}
return nBytesSent;


VC6编译;抓包工具是wireshark1.2.1

我的程序大致是这样:
启动两个线程(T1,T2)和服务器通信,每个线程单独和服务器建立一个连接,T1发送数据,T2接收数据并回应。
T1一直都很正常;
T2在接收到特定数据包后,进入应答流程,发生上述问题。导致服务器收不到应答,则认为连接异常,估计执行
了closesocket, 结果把T1的连接给干掉了。。。(抓包分析发现收到了RST包)反而导致T1重连。业务异常。

分析过程中,抓包发现,T2虽然在程序里send应答包成功,但是抓包根本就没有抓到数据。

百思不得其解,请高手指教。。。

...全文
815 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
luisszhou 2009-08-24
  • 打赏
  • 举报
回复
问题已经查出,感谢arong1234给我的思路。果然和异常RST没有关系。

主要是还是自己程序里一个共享区控制代码有bug,导致触发时内存访问错误,影响到socket通讯。

现在修复了这个bug,就可以抓到消失的那个T2的包了。。。

看来在碰到MS不可能的情况时,需要考虑下其他方面的因素。

结贴,给分

luisszhou 2009-08-22
  • 打赏
  • 举报
回复
对了,环境是windows2K3
创建socket是 socket(AF_INET, SOCK_STREAM, 0)
luisszhou 2009-08-22
  • 打赏
  • 举报
回复
谢谢楼上指点。

顶楼说了,“导致服务器收不到应答,则认为连接异常,估计执行了closesocket, 结果把T1的连接给干掉了。。。(抓包分析发现收到了RST包)”,

确实是服务器主动断开连接-->因为它没有收到我发出的应答包-->因为我的程序虽然send()成功,但是没抓到包。。。

fantiyu 2009-08-22
  • 打赏
  • 举报
回复
收到RST表明服务器中断了连接, 不是你这里中断
arong1234 2009-08-22
  • 打赏
  • 举报
回复
我觉得楼主的分析可能是make sense的,个人觉得不应该关注这些异常的RST,而是看看为什么T2没有发出去。因为RST中断的是T1,完全有可能是因为T2没发出引起的。这时候去分析RST,可能陷入歧途,耽误时间
[Quote=引用 4 楼 ccaiben 的回复:]
请把全部抓包发上来分析。光一个RST,说明服务器端数据接收异常。调用closesocket正常情况下应该发FIN。
[/Quote]
arong1234 2009-08-22
  • 打赏
  • 举报
回复
如果本机确实没有抓到发出的数据,确实有问题,我估计你需要调整你抓包程序的filter,有没有指定特定地址抓包?我估计没有发到你需要的网络中去,而是发到不知道什么地方的终端去了,从而导致异常
[Quote=引用 3 楼 luisszhou 的回复:]
对了,环境是windows2K3
创建socket是 socket(AF_INET, SOCK_STREAM, 0)

[/Quote]
伏地码 2009-08-22
  • 打赏
  • 举报
回复
请把全部抓包发上来分析。光一个RST,说明服务器端数据接收异常。调用closesocket正常情况下应该发FIN。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧