用TCP/IP协议进行通讯时,A向B发送一组长度为100字节的完整数据,为保证能全部发送出去,采用循环发送的方法BOOL MySend(...)
{
int nMax =100
char Buff[nMax];
char *ptr=Buff;
...
...
while(nMax > 0)
{
int nLen = send(sock,ptr,nMax,0);
if(nLen < 0)
return false;
nMax -=nLen;
ptr += nLen ;
}
return ture;
} 加入第一次调用send返回值nLen=80;说明向系统缓冲区拷贝了80个字节的数据,当第二次调用send时如果返回SOCKET_ERROR,说明发送失败了,可能网络中断或是其他原因引起的。则100个字节中剩余的20个字节没有被发送出去。因为这100个字节的数据才是一组完整的有效数据,那剩余的20个字节的数据岂不是发不出去了。
像这样的问题该怎么解决呢?
{
int nMax =100
char Buff[nMax];
char *ptr=Buff;
...
...
while(nMax > 0)
{
int nLen = send(sock,ptr,nMax,0);
if(nLen < 0)
return false;
nMax -=nLen;
ptr += nLen ;
}
return ture;
} 加入第一次调用send返回值nLen=80;说明向系统缓冲区拷贝了80个字节的数据,当第二次调用send时如果返回SOCKET_ERROR,说明发送失败了,可能网络中断或是其他原因引起的。则100个字节中剩余的20个字节没有被发送出去。因为这100个字节的数据才是一组完整的有效数据,那剩余的20个字节的数据岂不是发不出去了。
像这样的问题该怎么解决呢?
解决方案 »
- 新手怎么学内核编程
- 求实现CTreeCtrl是否点击在图片上的代码
- 汗! CString.Format如何转换long???
- 为什么程序执行到rs_fee.Open(CRecordset::forwardOnly,strSqlCom,CRecordset::none)时停止反应了?(急!!!!!)
- 为什么这个对话框打不开?
- 如何去掉MDI程序中子窗口(childFrame)的下凹变框!
- Adoconnection
- 如何实现全屏?
- VC++为什么我的程序ctrl+F5就能执行,而生成的EXE(或F5)双击就绝对不执行???附代码!
- 请问,大家都用VC6做什么啊
- vc6.0的调试问题,寻求大家帮助
- 问一个简单的问题 有关指针的
你发送出去提示 Send_ERROR 证明是你的程序问题吧!
54H:为指令
数据n:
...
校验和:
... 接收方接收到“数据长度字节”后,就知道这组数据的总长度了,比如说99,然后他开始接收99个字节,可是我在发送时因为出现了我上面提到的问题,所以实际上我只发送了80个字节的数据,而对方还按照100个字节接收,这就错误了。所以我想,要想保证数据接收方能接收到正确的数据,首先我发送时就得保证每次发送的数据都是完整的。如果出现上面的情况,因为已经有80个字节发送出去了,所以当连接恢复后,我必须得想办法把包中剩余的20个字节给发送出去,以便接收方能接收到完整的100个字节的数据。只是我不知道该怎么做才能实现。以上是我的理解,不知对不对,请高手给参谋一下,多谢。
你发送出去提示 Send_ERROR 证明是你的程序问题吧!
////我有点明白了。对于函数int send(SOCKET s,const char FAR *buf,int len,int flags);如果我指定了len大小为100,虽然我分多次调用,但还是只有100个字节大小的数据全部拷贝成功,TCP才会认为这是一次成功的拷贝。如果只拷贝80个字节就出错了,则TCP会将那80个字节的无效数据丢弃,以维护数据的完整性。我这样解释对吗?
tcp 会保证这100个字节,发送成功 它才会返回成功!
先取包头做判断 再取包长 再根据包长 取数据 如果 检查缓冲里面的数据 不够包长,就等待继续收包!
超时 就 抛弃缓冲 请求再发///对方在收到“包长”字节前,并不知道数据长度到底多长,那开始设置的大缓冲的长度设置多大为宜?
比如说我设置缓冲为1024个字节,可实际数据包长为300个字节,那我拆包时是不是先拆前300个,然后再判断第301个是不是包头,以此类推进行操作?
还有就是“超时 就 抛弃缓冲 请求再发”这个怎么操作,是不是只要我设置了接收超时而每收到数据包后,TCP会自动请求再发,还是我自己需要做些编码工作?
如果你发 100字节 第一次只收 80 字节 很正常 再重复收包就行了!具体参考 tcp协议!
------------
就是这个意思!还有就是“超时 就 抛弃缓冲 请求再发”这个怎么操作,是不是只要我设置了接收超时而每收到数据包后,TCP会自动请求再发,还是我自己需要做些编码工作?
-----------------------------------
要你自己做了! tcp是不会掉包的! 如果出现包不全了 一般是数据处理出现的问题了! 跟tcp协议本身没关系
tcp 会保证这100个字节,发送成功 它才会返回成功!
////那就是说我也可以按照下面这样理解了?如果我指定了len大小为100,虽然我分多次调用,但还是只有100个字节大小的数据全部拷贝成功,TCP才会认为这是一次成功的拷贝。如果只拷贝80个字节就出错了,则TCP会将那80个字节的无效数据丢弃,以维护数据的完整性。
是个阻塞的函数,直到发送完
如果nSend == 发送的大小 , send 完成,
如果nSend < 发送的大小 socket异常,
///
我现在想知道的就是这种情况下,已经发送出去的nSend长度的数据是不是会一直保存在系统缓冲区中?