tcp 可以连接,但无法接收数据的原因

dodo_check 2009-08-03 10:51:17
用wsaasyncselect 做的异步传输
在客户端成功连接到服务器后,由服务器向客户端发送数据,但客户端收不到,一直没有收到FD_READ.
由wireshark 抓到的包.

Client:
No. Time Source Destination Protocol Info
1 0.000000 10.133.5.66 202.198.17.93 TCP 4826 > ddi-tcp-1 [SYN] Seq=0 Win=16384 Len=0 MSS=1460
2 0.069084 202.198.17.93 10.133.5.66 TCP ddi-tcp-1 > 4826 [SYN, ACK] Seq=0 Ack=1 Win=17520 Len=0 MSS=1460
3 0.069093 10.133.5.66 202.198.17.93 TCP 4826 > ddi-tcp-1 [ACK] Seq=1 Ack=1 Win=17520 Len=0
4 59.782853 10.133.5.66 202.198.17.93 TCP 4826 > ddi-tcp-1 [FIN, ACK] Seq=1 Ack=1 Win=17520 Len=0
5 59.837424 202.198.17.93 10.133.5.66 TCP ddi-tcp-1 > 4826 [RST] Seq=1 Win=0 Len=0

No.4是在60s之后,没有收到来自服务器段的数据,主动断开.


Server:
1 0.000000 218.62.24.171 202.198.17.93 TCP 28095 > ddi-tcp-1 [SYN] Seq=0 Win=16384 Len=0 MSS=1460
2 0.000045 202.198.17.93 218.62.24.171 TCP ddi-tcp-1 > 28095 [SYN, ACK] Seq=0 Ack=1 Win=17520 Len=0 MSS=1460
3 0.066286 218.62.24.171 202.198.17.93 TCP 28095 > ddi-tcp-1 [ACK] Seq=1 Ack=1 Win=17520 Len=0
4 0.067457 202.198.17.93 218.62.24.171 TCP ddi-tcp-1 > 28095 [PSH, ACK] Seq=1 Ack=1 Win=17520 Len=18
5 2.974021 202.198.17.93 218.62.24.171 TCP [TCP Retransmission] ddi-tcp-1 > 28095 [PSH, ACK] Seq=1 Ack=1 Win=17520 Len=18
6 8.989597 202.198.17.93 218.62.24.171 TCP [TCP Retransmission] ddi-tcp-1 > 28095 [PSH, ACK] Seq=1 Ack=1 Win=17520 Len=18
7 21.020742 202.198.17.93 218.62.24.171 TCP [TCP Retransmission] ddi-tcp-1 > 28095 [PSH, ACK] Seq=1 Ack=1 Win=17520 Len=18
8 44.973657 202.198.17.93 218.62.24.171 TCP [TCP Retransmission] ddi-tcp-1 > 28095 [PSH, ACK] Seq=1 Ack=1 Win=17520 Len=18
9 92.988867 202.198.17.93 218.62.24.171 TCP [TCP Retransmission] ddi-tcp-1 > 28095 [PSH, ACK] Seq=1 Ack=1 Win=17520 Len=18


请教一下,出现这样的情况 都可能是什么原因?
客户端是windows 2003 server,没有安装防火墙,是客户端往外连时 用的代理服务器的防火墙的问题么?
或者其它原因?

...全文
5882 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mscrack 2009-08-05
  • 打赏
  • 举报
回复
client抓的包, 只是跟server的TCP握手包吧, 并不是用户自己发的包
米西牙乖 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dodo_check 的回复:]
请问一下.
如果 通信正常的话,异步socket,
没有对socket进行设置的情况下,在一端send发送数据后,紧接着closesocket.另一端会正确接受完数据,再收到fd-close么?
[/Quote]

不能Close Socket!!!怎么能这样编???
Socket应该在程序退出时,再Close。

楼主的问题找到了。。.
fangle6688 2009-08-04
  • 打赏
  • 举报
回复
引用
请问一下.
如果 通信正常的话,异步socket,
没有对socket进行设置的情况下,在一端send发送数据后,紧接着closesocket.另一端会正确接受完数据,再收到fd-close么?


不一定,对方可能数据没收完就收到fd-close,接收操作被取消
dodo_check 2009-08-04
  • 打赏
  • 举报
回复
请问一下.
如果 通信正常的话,异步socket,
没有对socket进行设置的情况下,在一端send发送数据后,紧接着closesocket.另一端会正确接受完数据,再收到fd-close么?
Conry 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dodo_check 的回复:]
引用 4 楼 conry 的回复:
你是通过什么访问服务器的,代理还是路由直接访问,也就是202.198.17.93是做什么的
你登录QQ或者MSN的话需不需要设置代理服务器


202.198.17.93 不需要,直接上
10.133.5.66 是局域网IP,但连得时候也不用设置代理服务器,
但出去后是包地址是218.62.24.171,具体我也不太明白 怎么设置的。


[/Quote]

218.62.24.171应该是路由器的地址

这个不用可以管

如楼上所说,还是把你的代码拿出来看看吧
xiaohuizhijia 2009-08-03
  • 打赏
  • 举报
回复
为什么不可以把你的部分源码贴上来?
让别人看wireshark 抓到的包没有什么意义,就正如犯罪现场不能让办案人员进入,只能观看一下外面的监控录象.
dodo_check 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 conry 的回复:]
你是通过什么访问服务器的,代理还是路由直接访问,也就是202.198.17.93是做什么的
你登录QQ或者MSN的话需不需要设置代理服务器

[/Quote]
202.198.17.93 不需要,直接上
10.133.5.66 是局域网IP,但连得时候也不用设置代理服务器,
但出去后是包地址是218.62.24.171,具体我也不太明白 怎么设置的。

king_query 2009-08-03
  • 打赏
  • 举报
回复
Up
Conry 2009-08-03
  • 打赏
  • 举报
回复
你是通过什么访问服务器的,代理还是路由直接访问,也就是202.198.17.93是做什么的
你登录QQ或者MSN的话需不需要设置代理服务器
dodo_check 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 conry 的回复:]
你的服务器根本就没发包吧
问题在你发送接收的代码里

[/Quote]
4 0.067457 202.198.17.93 218.62.24.171 TCP ddi-tcp-1 > 28095 [PSH, ACK] Seq=1 Ack=1 Win=17520 Len=18

这个好像就是 抓到的服务器发的包吧
Conry 2009-08-03
  • 打赏
  • 举报
回复
你的服务器根本就没发包吧
问题在你发送接收的代码里
oyljerry 2009-08-03
  • 打赏
  • 举报
回复
代理服务器可能会有防火墙屏蔽等
dodo_check 2009-08-03
  • 打赏
  • 举报
回复
发送 端得代码如下

int nSendSize = 0;
while (TRUE)
{
//如果需要发送的大小为0 ,退出
if (m_PacketProtocal.sSendBufferInfo.nPacketLen-m_PacketProtocal.sSendBufferInfo.nSendLen == 0)
return;

nSendSize = send(hSocket,m_PacketProtocal.pSendBuffer+m_PacketProtocal.sSendBufferInfo.nSendLen,m_PacketProtocal.sSendBufferInfo.nPacketLen-m_PacketProtocal.sSendBufferInfo.nSendLen,0);
if (nSendSize > 0)
{
m_PacketProtocal.sSendBufferInfo.nSendLen += nSendSize;
//如果全部发送完退出
if (m_PacketProtocal.sSendBufferInfo.nSendLen == m_PacketProtocal.sSendBufferInfo.nPacketLen)
{
m_PacketProtocal.sSendBufferInfo.nSendLen = 0;
m_PacketProtocal.sSendBufferInfo.nPacketLen=0;

return;
}
}
else
if (nSendSize == 0 )
{
if (m_nShowTestInfo) // For Test
{
memset(pTest,0,250);
sprintf(pTest,"send buffer 发送0字节 \r\n");
m_ErrorLog.WriteInfo(pTest);
}
return;
}
else if (nSendSize == SOCKET_ERROR)
{
int nErrorCode = WSAGetLastError();
switch(nErrorCode)
{
case WSAEWOULDBLOCK:
PostMessage(m_hWnd,WM_WRITEMSG,2,0);

m_strInfoMsg.Format("发送SendBuffer动作出现阻塞,错误信息:%d",WSAGetLastError());
WriteLog("文件传输",m_strInfoMsg,"失败");
break;

case WSAETIMEDOUT:
m_strInfoMsg.Format("发送SendBuffer出现超时错误,错误信息:%d",WSAGetLastError());
WriteLog("文件传输",m_strInfoMsg,"失败");
break;

default:
m_strInfoMsg.Format("发送SendBuffer出现错误,错误信息:%d",nErrorCode);
WriteLog("文件传输",m_strInfoMsg,"失败");
return;

}
}

}



接收端没有收到数据,一直没有执行,
好像问题在 数据已经发出,但在接收端没有收到
dodo_check 2009-08-03
  • 打赏
  • 举报
回复
发送的代码如下:
[code=C/C ]
int nSendSize = 0 ;
while (TRUE)
{
//如果需要发送的大小为0 ,退出
if (m_PacketProtocal.sSendBufferInfo.nPacketLen-m_PacketProtocal.sSendBufferInfo.nSendLen == 0)
return;

nSendSize = send(hSocket,m_PacketProtocal.pSendBuffer+m_PacketProtocal.sSendBufferInfo.nSendLen,m_PacketProtocal.sSendBufferInfo.nPacketLen-m_PacketProtocal.sSendBufferInfo.nSendLen,0);
if (nSendSize > 0)
{
m_PacketProtocal.sSendBufferInfo.nSendLen += nSendSize;
//如果全部发送完退出
if (m_PacketProtocal.sSendBufferInfo.nSendLen == m_PacketProtocal.sSendBufferInfo.nPacketLen)
{
m_PacketProtocal.sSendBufferInfo.nSendLen = 0;
m_PacketProtocal.sSendBufferInfo.nPacketLen=0;

return;
}
}
else
if (nSendSize == 0 )
{

return;
}
else if (nSendSize == SOCKET_ERROR)
{
int nErrorCode = WSAGetLastError();
switch(nErrorCode)
{
case WSAEWOULDBLOCK:
PostMessage(m_hWnd,WM_WRITEMSG,2,0);

m_strInfoMsg.Format("发送SendBuffer动作出现阻塞,错误信息:%d",WSAGetLastError());
WriteLog("文件传输",m_strInfoMsg,"失败");
break;

case WSAETIMEDOUT:
m_strInfoMsg.Format("发送SendBuffer出现超时错误,错误信息:%d",WSAGetLastError());
WriteLog("文件传输",m_strInfoMsg,"失败");
break;

default:
m_strInfoMsg.Format("发送SendBuffer出现错误,错误信息:%d",nErrorCode);
WriteLog("文件传输",m_strInfoMsg,"失败");
return;

}
}

}

[code ]

18,363

社区成员

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

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