主要步骤
主线程:A
1、数据处理
2、通知发线程从队列中发送数据
发线程:(Client)B
1、向上级发连接请求
2、接收server发来的数据
3、收到server发来的标记后,开始向server发数据
4、向client发送标记,并结束这次通讯
收线程:(Server)C
1、listen
2、向client发送数据
3、向client发送标记
简要流程
A1-A2-B1-C1-C2-B2-C3-B3-B4现在的问题发生在,一端向另一端发送数据后,另一端没有把数据全部接收回来。
为什么??
恳请各路大虾前来帮助!!!
主线程:A
1、数据处理
2、通知发线程从队列中发送数据
发线程:(Client)B
1、向上级发连接请求
2、接收server发来的数据
3、收到server发来的标记后,开始向server发数据
4、向client发送标记,并结束这次通讯
收线程:(Server)C
1、listen
2、向client发送数据
3、向client发送标记
简要流程
A1-A2-B1-C1-C2-B2-C3-B3-B4现在的问题发生在,一端向另一端发送数据后,另一端没有把数据全部接收回来。
为什么??
恳请各路大虾前来帮助!!!
有时是因为过快的发送方把缓慢的接受方淹没
建议多建立几个socket连接,交替传输,然后粘起来.
希望对你有所帮助.
2、建议改成
发送标志->发送数据
否则有可能不知道到底是数据还是标志,特别是数据不确定,先发标志,可以在标志中包含数据大小等信息(通常理解为包头)
對於笑關鍵字用socket不錯,但對大得..我們現在打算用ftp..這樣快得多.
1 TCP是流式的,所以发送者send(...)一个包时, 接受端可能分成几个包接受;
也有可能发送者send(...)多个包时, 接受端合成为一个包接受. 主要根据
网络上流量状况
2 socket有两种操作方式, 一种是阻塞的,另一种是非阻塞.
假如是阻塞方式,应该这样接受
int ret = 0;
while(1)
{
ret = recv(...);
if(ret<=0)
{
close(...);
break;
}
}
当ret=0时, 表示对方close(..) ,当ret<0时表示socket错误
有了定界符,你就可以用一个while循环来判断收完没有。
例如在知道长度时:
int nLeft = xxx;
while(nLeft > = 0)
{
ret = recv(-, -, nLeft,-);
if(ret == 0)
break;
nLeft -= ret;
}这个长度可以在在发送数据之前先发送,所以接收方收到的头4个字节就是表示长度的整型
http://www.csdn.net/expert/topic/829/829303.xml?temp=7.686794E-03
“有时是因为过快的发送方把缓慢的接受方淹没”这句话怎么理解