是高手的活,就进来!!(高分请教)!!

tjandy 2003-08-19 08:17:37
1、我用winsock(tcp/ip)来通讯,但传输的包太大,所以有部分数据收不到,有没 有什么办法能解决?
2、现在我想把包的大小设置一下,应该怎么做?
...全文
29 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ThinkX 2003-08-26
  • 打赏
  • 举报
回复
tcp是基于流的协议,不存在包太大的情况。
虽然其内部也使用包实现的,但是已经为我们做了很多底层的动作。
jingrunx 2003-08-26
  • 打赏
  • 举报
回复
sock的缓冲只有16k,不能一次发送超过16384字节的数据。


send并不是你要求发多少他就发多少,你要检查返回值,那才是他真正发送出去了的数据长度,剩下的需要重发。
test7979 2003-08-26
  • 打赏
  • 举报
回复
用TCPIP协议不存在
(包太大,所以有部分数据收不到)这种情况
它保证发出去的数据对方一定是收到的并且是按次序的

除非你代码有问题

也许你send没有检查发送了多少字节这个返回值
kensou_z 2003-08-26
  • 打赏
  • 举报
回复
socket也是用缓冲区来缓冲分包的,所以当socket的缓冲区满时就有可能掉包
child_bj 2003-08-21
  • 打赏
  • 举报
回复
呵呵
停止等待协议,加CRC-16效验,我刚做的是用AT指令操作猫的。不过原理差不多了。我觉得最好用UDP做。给你我写的CRC-16的函数:
char * encodeCRC16(char *parDividend,long parDividendLen) /*进行CRC-16编码*/
{
char * cDividend = (char *)malloc((parDividendLen + 2) * sizeof(char));
int Divisor = 98309;
long dividend = 0;
int cPos = 7;
int i;
unsigned char tmpCNum = 0x80;
int j;
/*在想编码的数据后加16位0*/
for (j = 0; j < (parDividendLen + 2); j++)
{
cDividend[j] = j < parDividendLen ? parDividend[j] : 0;
}
if (parDividendLen < 3) /*如果不满17位,则直接算冗余码*/
{
dividend = cDividend[0];
dividend = dividend << 8;
dividend += cDividend[1];
cDividend[parDividendLen + 1] = dividend & 0x000000FF;
cDividend[parDividendLen] = ( (dividend & 0x0000FF00) >> 8);
return cDividend;
}
/*先读进17位*/
dividend = cDividend[0];
dividend = dividend << 8;
dividend += cDividend[1];
dividend = dividend << 1;
dividend += (cDividend[2] & tmpCNum) >> cPos--;
tmpCNum = tmpCNum >> 1;
while ((0x00010000 & dividend) == 0) /*如没满17位,则继续读取二进制数*/
{
dividend = dividend << 1;
dividend += (cDividend[2] & tmpCNum) >> cPos--;
tmpCNum = tmpCNum >> 1;
}
/*进行模二运算*/
dividend = dividend ^ Divisor;
for (i = 2; i < (parDividendLen + 2); i++)
{
while (1)
{
dividend = dividend << 1;
dividend += ( cDividend[i] & tmpCNum ) >> cPos--;
tmpCNum = tmpCNum >> 1;
dividend = (0x00010000 & dividend) == 0 ? dividend : (dividend ^ Divisor);
if (cPos < 0)
{
cPos = 7;
tmpCNum = 0x80;
break;
}
}
}/*end of for*/
cDividend[parDividendLen + 1] = dividend & 0x000000FF;
cDividend[parDividendLen] = ( (dividend & 0x0000FF00) >> 8);

return cDividend;
}
ccz_4964 2003-08-21
  • 打赏
  • 举报
回复
自定义报文头:引导符+发送者+接收者+报文长度
自定义一个缓冲区用来接收数据,每次只处理缓冲区指定长度的数据。
catac 2003-08-20
  • 打赏
  • 举报
回复
socket不是不用自动分包的吗
yesry 2003-08-20
  • 打赏
  • 举报
回复
对啊,tcp可以自动地啊。
tjandy 2003-08-19
  • 打赏
  • 举报
回复
谢谢 xpdavis(咕嘟)
在请教一下
如果现在我有一个要传输的文件,怎么拆分它??
sprewellkobe 2003-08-19
  • 打赏
  • 举报
回复
顶!
铖邑 2003-08-19
  • 打赏
  • 举报
回复
拆成小包。
序号 字段
1 开始标志
2 报文长度
3 数据
4 结束标志
chifengwatch 2003-08-19
  • 打赏
  • 举报
回复
同意 mme(dog),xpdavis(咕嘟),建议加校验位。
mme 2003-08-19
  • 打赏
  • 举报
回复
这个简单,你读一段就传一段,不就行了.

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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