【发布时间】:2011-03-26 21:36:00
【问题描述】:
我有一个小型应用程序,它通过网络将文件发送到位于 Windows 操作系统上的代理。
当此应用程序在 Windows 上运行时,一切正常,通信正常,文件全部复制成功。
但是,当这个应用程序在 Linux 上运行时(RedHat 5.3,接收器仍然是 Windows) - 我在 Wireshark 网络跟踪消息中看到 TCP Zero Window 和 TCP Window Full 每隔 1-2 秒出现一次。然后代理会在几分钟后关闭连接。
Windows - Linux 代码几乎相同,而且非常简单。唯一重要的操作是带有 SO_SNDBUF 和值为 0xFFFF 的 setsockopt。删除此代码没有帮助。
有人可以帮我解决这个问题吗?
编辑:添加发送代码 - 看起来它可以正确处理部分写入:
int totalSent=0;
while(totalSent != dataLen)
{
int bytesSent
= ::send(_socket,(char *)(data+totalSent), dataLen-totalSent, 0);
if (bytesSent ==0) {
return totalSent;
}
else if(bytesSent == SOCKET_ERROR){
#ifdef __WIN32
int errcode = WSAGetLastError();
if( errcode==WSAEWOULDBLOCK ){
#else
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
#endif
}
else{
if( !totalSent ) {
totalSent = SOCKET_ERROR;
}
break;
}
}
else{
totalSent+=bytesSent;
}
}
}
提前致谢。
【问题讨论】:
-
更多详情?文件传输是否成功,只是传输速度较慢,还是传输失败?如果它失败了,它在哪里失败了?有什么东西通过了还是中途失败了?
-
@罗伯特,谢谢。传输失败。例如,如果我传输的文件夹包含 2 GB 的 3 KB - 50 KB 文件,它有时会传输 ~0.5 GB,有时会传输 ~1.3 GB 的数据,然后失败。
-
您收到了哪些错误消息以及哪一方正在关闭连接?您使用的是阻塞还是非阻塞 I/O。你有专门的线程做 I/O 吗?越详细越好,如果能贴出代码片段就最好了。
-
什么是
::send(...)?这是包装标准send(...)函数的类的成员吗? -
您也可以发布接收代码吗?听起来数据可能无法在接收端提取。
标签: c++ tcp cross-platform network-programming