社区
Windows SDK/API
帖子详情
是高手的活,就进来!!(高分请教)!!
tjandy
2003-08-19 08:17:37
1、我用winsock(tcp/ip)来通讯,但传输的包太大,所以有部分数据收不到,有没 有什么办法能解决?
2、现在我想把包的大小设置一下,应该怎么做?
...全文
29
13
打赏
收藏
是高手的活,就进来!!(高分请教)!!
1、我用winsock(tcp/ip)来通讯,但传输的包太大,所以有部分数据收不到,有没 有什么办法能解决? 2、现在我想把包的大小设置一下,应该怎么做?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
这个简单,你读一段就传一段,不就行了.
我在CSDN参与的3000个帖子
今日偶然翻到,感慨万千 1:申述:版主,是否扣了我的专家分? 2:100分急求,随机输出十个小写字母,但是,要求这十个字母不相同 3:求Sn=a+aa+aaa+…+aaa…a(n个a)之值 4:数组题 望
高手
帮忙! 5:呵呵,来推荐一下我的网站,本站提供大量当今流行的免费的音乐和免费电影,常用软件、游戏、精美图库下载,希望对网友有帮助!顺便散分! 6:VBA
请教
怎
基础
各位兄弟,在SDK编程中如果实现窗口分割呢?请问怎么得到一个函数的执行时间,单位毫秒!如何调试asp组件呀。用vc++调试编制的组件怎样画一个箭头?
高分
请教
如何限制程序运行的方法?求助:通过编程DirectX抓屏------>masterz:再麻烦你一下,谢谢熟悉RichEdit的朋友过来看一下,RichEdit的几个问题.如何对 I/O 端口进行操作?有了该问题就有了思考(100分 献礼!)如何
Network Thread
怎样让控制台程序也能处理消息?到底这样可以吗?请
高手
指点。我在多线程中使用CSocket的,怎么老是出错,请大家帮我看看!VC中使用IXMLHTTPRequest获取URL信息的问题,有代码*********************************************如何通过IXMLHTTPRequest下载文件?300分
请教
如何向DNS查询MX记录(SDK+socket)那位仁兄有在
系统:Shell和GDI Thread和杂项等
Q如何判断是文件,还是目录?急!! T请各位
高手
指教,在c 语言中,用程序怎样判断要操作的是一个目录还是一个文件?在c语言中要调用api函数时许包含什么头文件?具体要用到什么函数请多多帮忙!!谢谢!!APathIsDirectory#include Q用程序怎么打印一个Word或者RTF文档啊? T比如有C:/a.rtf我怎么可以把它送到打印机打出来呢?AShellExecute C:/a.rtf
数据库帖子收集
这样的数据列表在存储过程中应该怎么样选择得到? 请问造成SQL2000服务不能启动的原因有哪些? sql server中有無類似于if 的函數,即像這樣select if(cancel=1,'cancel','') from sales 这样怎么返回呀!!!!记录集的返回。。 谁能跟我说说期初库存怎么样的一个业务逻辑!都要处理哪些内容!需要每月进...
Windows SDK/API
1,221
社区成员
8,136
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章