各路兄弟请帮忙!我使用tcp传输数据,buf的大小在40几k,为什么send函数只返回9k多!!对方也只收到9k多 nResult=send(m_hSocket, (LPSTR)pHead->szBuf, pHead->MSG_LEN+16,nFlags);上面的发送:其中pHead->szBuf我定义了约100000个字节,发送时 pHead->MSG_LEN+16==49276 但nResult只返回9432,我是和一个java服务器通信,她也只收到了9432。我该怎么办?非常感谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 socket不是你家的自来水管,想传多少就传多少的,有mtu和其他因素的限制,你要做个循环,一点一点传,同时接受方最好有应答. 小西瓜:我该怎么一点一点传送?tcp/ip 不是可以自己拆分传输吗?其中的拆分传输还要我来管理阿?你说的是如下这样传送吗?char* p=pHead->szBuf;int sendLen=1000;while(pHead->MSG_LEN+16>0){if(pHead->MSG_LEN+16<1000)sendLen=pHead->MSG_LEN+16;send(m_hSocket, p, sendLen,nFlags);p+=1000;pHead->MSG_LEN+16-=1000;}关键是我的数据是一个整体,拆分了服务器看得懂吗?服务器是不是还需要人为的再组合起来?并且客户端还要发一个结束包?这搞得复杂了,我原想直接给出整个包的长度,就让他一个包不管怎样一次send发完。这办不到啊?难道只能拆分吗? IP包的长度是有限制的 你需要分快发送 比如开辟一个1000个字节的缓冲区 把数据分块放进去发送 对方接收以后放进内存 不需要什么重组 只需要接到你原来接收的后面就可以了 你数据是整体发送到对方不也是整体了 ??如果你想40几K一次传完 你好好的看看TCP/IP方面的资料吧 在发送的时候你先发送整个包的长度不就可以验证发送的正确性???这是你定义的传输通讯协议的问题了 必须分开传送,这个CSocket的限制。你必须如你所说的传,不论数据大小,发送后都要检查发送结果状态,如果不够长度的话要再传,客户端也是一样的,接受的时候,如果不够长度的话,要再接收。发送和接受都要持续到数据传送完毕或者网络异常再结束。如果总数据长度客户端不知道,那么要约定一个定长数据头,并且在数据头内至少给出接下来的数据长度。客户端先接受定长数据头,然后根据数据头信息接收数据。如果采用TCP协议,那么不用自己关心每次发出的数据完整性,但客户端要负责把多次收到的数据组合(注意,不是底层协议级的,是你每一次的Recive)起来。如果采用UDP协议,那么要自己保证数据完整性和序列性,这个时候你的数据头内至少还要有一个序列号信息。 你还可以参考Indy9(Delphi/BCB组件)里边TCP/UDP相关组件的实现,对发送和接收进行了封装,不用自己处理这些异常。其Send只需给出Buf和Len就会保证全部发出。其Recive只要给出Buf和Len就会接收,直到接收完成或者超时返回。真希望MFC的封装也能进步一些。还有啊,本人知道TCP/IP协议有底层分包的大小限制,默认是1500Byte,和网卡、路由器等网络路径上的节点有关系,我说的话有些地方可能表述的不准确,希望不要会意错了。 多谢诸位,我用的是socket api, 经mfkzj() 和iting(倚天)两位朋友的指点有些明白了,to mfkzj():但是就是服务端必须一直recieve直到他收到我协议头里指定大小的数据之后才能停止,对巴?还有就是服务端如何recieve和客户端如何send无关吗?例如上面我40k的数据 send了20次,但是在服务端我并不需要recieve20 次吧,几次比较好呢?据说send recieve可以优化,每次send 1k左右最好,是这样吗?我上面的代码可以吗?我想是不是send时,tcp/ip的协议栈的大小决定了一次send大小的限制,我每次send大小最大值好像都在10k左右,是这样的吗 没办法呀,我客户端是vc 服务端是java ,要都是用mfc或者delphi来做可能就很简单了 http://wangfeng.vicp.net/mymmsc/index.asp 如果你是美女,就看看我的解答:如果你没有利用任何别的函数裤,那么注定你必须用循环来传,一直到传玩为止接受方呢,则可以一次性接受,随便你要接受多少字节都可以估计你可能对网络编程不是很了解,发送方和接受方没有什么逻辑上的关系,我的意思是:不考虑网络出故障的情况下,发送100个字节,你可以send100次,而接受方只需要一次receive就能完全搞定反过来,你send1次,receive100次也不会有问题 BABIZHU(巴比猪) ( ) 信誉:97 你的描述不全对。当接收缓冲区小于要接收的数据量,且数据是用UDP方式发送的,你可以一次Recieve完吗? 一般人不可能知道的问题 opengl"红宝书"里那么大的字竟然没有人知道,网上也没有人讨论,真是奇怪!! IOCP模型接收文件CPU占用率奇高 NT服务程序求教 文件保存问题,看看这个代码 请问有谁知道vc.net中文版的下载地址 请问如何阅读源代码较好? 求教:VC工具栏编辑器的问题。 为什么老是出现unresolved external symbol _closesocket@4 有没办法写个外挂修改Save as操作得到自己想要的文件格式 VB的窗体能不能透明呀。或是在设置了BorderStyle为0后。能不能在改变其形状。 又一个非常菜的问题,动态分配的二维数组如何释放内存
阿?你说的是如下这样传送吗?char* p=pHead->szBuf;
int sendLen=1000;while(pHead->MSG_LEN+16>0){
if(pHead->MSG_LEN+16<1000)sendLen=pHead->MSG_LEN+16;
send(m_hSocket, p, sendLen,nFlags);
p+=1000;
pHead->MSG_LEN+16-=1000;
}
关键是我的数据是一个整体,拆分了服务器看得懂吗?服务器是不是还需要人为的再组合起来?并且客户端还要发一个结束包?这搞得复杂了,我原想直接给出整个包的长度,就让他一个包不管怎样一次send发完。这办不到啊?难道只能拆分吗?
如果你想40几K一次传完 你好好的看看TCP/IP方面的资料吧 在发送的时候你先发送整个包的长度不就可以验证发送的正确性???这是你定义的传输通讯协议的问题了
你必须如你所说的传,不论数据大小,发送后都要检查发送结果状态,如果不够长度的话要再传,客户端也是一样的,接受的时候,如果不够长度的话,要再接收。
发送和接受都要持续到数据传送完毕或者网络异常再结束。
如果总数据长度客户端不知道,那么要约定一个定长数据头,并且在数据头内至少给出接下来的数据长度。客户端先接受定长数据头,然后根据数据头信息接收数据。
如果采用TCP协议,那么不用自己关心每次发出的数据完整性,但客户端要负责把多次收到的数据组合(注意,不是底层协议级的,是你每一次的Recive)起来。
如果采用UDP协议,那么要自己保证数据完整性和序列性,这个时候你的数据头内至少还要有一个序列号信息。
还有啊,本人知道TCP/IP协议有底层分包的大小限制,默认是1500Byte,和网卡、路由器等网络路径上的节点有关系,我说的话有些地方可能表述的不准确,希望不要会意错了。
但是就是服务端必须一直recieve直到他收到我协议头里指定大小的数据之后才能停止,对巴?还有就是服务端如何recieve和客户端如何send无关吗?例如上面我40k的数据 send了20次,但是在服务端我并不需要recieve20 次吧,几次比较好呢?据说send recieve可以优化,每次send 1k左右最好,是这样吗?我上面的代码可以吗?
我想是不是send时,tcp/ip的协议栈的大小决定了一次send大小的限制,我每次send大小最大值好像都在10k左右,是这样的吗
如果你没有利用任何别的函数裤,那么注定你必须用循环来传,一直到传玩为止
接受方呢,则可以一次性接受,随便你要接受多少字节都可以估计你可能对网络编程不是很了解,发送方和接受方没有什么逻辑上的关系,我的意思是:不考虑网络出故障的情况下,发送100个字节,你可以send100次,而接受方只需要一次receive就能完全搞定
反过来,你send1次,receive100次也不会有问题