网络编程再请教,欢迎大家再来!

hsubo 2002-01-11 10:48:36
加精
SendBuf的返回值能不能代表接收端接收的情况?
比如:SendBuf的返回值为1024,能不能说接收端一定能够接收到1024字节。
如果不能,要是网络不好,是不是接收端要返回给发送端网络好坏的情况,做一个具有滑动窗口功能的收发程序?
...全文
278 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
cometofly 2002-02-07
  • 打赏
  • 举报
回复
哪裡有關於Socket Api編程的資料
我也要

Jagen在路上 2002-01-27
  • 打赏
  • 举报
回复
太棒了,几天没有来,居然有这么多高人,好人在这里面,小弟受益非浅阿,呵呵,大家有空长联系
yuyulily 2002-01-16
  • 打赏
  • 举报
回复
呵呵,精彩!
hsubo 2002-01-16
  • 打赏
  • 举报
回复
非阻塞模式下,返回值就只有count值和-1两种?让我很难想象。非阻塞方式的效率较高,难道一次最大就可以发送2G的文件了?
florist2000,redpower你们能不能提供给我一个非阻塞模式发端代码?
我原来做过非阻塞模式的程序,但我还是把一个文件包发送的,一次发8k.
常宁 2002-01-16
  • 打赏
  • 举报
回复
阻塞模式和非阻塞模式不同,CSocket并不是真正的异步方式,因此florist2000(善良的石头)所得没错,非阻塞方式的效率较高,使用windows内置Socket缓冲区,因此推荐使用
hsubo 2002-01-16
  • 打赏
  • 举报
回复
明白了,非常感谢 redpower,florist2000.......以及各位网友的精彩回复。
常宁 2002-01-16
  • 打赏
  • 举报
回复
当然可以一次发送2G文件,我最大测试过400M文件,2G的我就没有试验,不过理论上肯定是2G
最简单的非阻塞模式例子:(不推荐这么用)
char *buf;
buf=new char[10000000];
while(Socket->SendBuf(buf,10000000));
delete []buf;
简单吧
fenglingdu 2002-01-15
  • 打赏
  • 举报
回复
关注。。。
常宁 2002-01-15
  • 打赏
  • 举报
回复
to hsubo(bobo)
我的email:changning@ynmail.com
边界就是,如果用UDP连续不断发送10条消息,如果UDP客户端可以接收到所有的消息,即一定是10条,如果用TCP连续不断发送10条消息,TCP客户端肯定可以接收到所有消息,但一般不是10条,可能是1条,可能是2条,甚至可能是100条,这是因为UDP发送的是消息报(有边界)而TCP发送的是流(无边界)当然,如果将收到的100条消息连在一起,肯定与发送的内容连在一起完全一致
常宁 2002-01-15
  • 打赏
  • 举报
回复
to:florist2000(善良的石头)
我想你应该是个学生吧,Corba编程如果打算实现Socket的消息发送接收功能,可以说相当简单,并不是你说的很复杂,我想Corba的复杂性体现在更高级的应用上,如果仅发送消息,我看代码的长度同DCOM 差不多,而远远小于可靠传输的TCP.
如果用于传输大文件,或流比如音频/视频的时候,10M网络的传输性能可以超过700k/s也就是说如果一个包70字节可以发送10000次,而如果在100M上更高达6000k/s也就是高达100000次/秒但是这同正常的消息通讯相差甚远,不具备比较性!顺便说一下VC 的CSocket效率大概仅是TCustomSocket的1/10.这效率其实已经很高了
我是做消息中间件的智能代理(Smart Agent)和消息路由的,从软件角度看应该是属于服务器端,而不是你说的客户端,INDY组件的稳定性不错,但是效率不高,而且是阻塞方式的,我们不用,尽管TCustomSocket不能跨平台而Indy可以,作为高效率和高可靠性的开发,我们选用了TCustomSocket,这是我们多方面比较的结果包括API和Indy!我们的系统总共已经运行了数千亿次,没有出现任何问题。
我们现在要实现的中间件将基于Corba而不是Socket这是一种趋势,corba可以10000次/秒远程调用,其速度已经可以满足大多数的需要了。而提供的附加功能却是强大的。
欢迎讨论,如果觉得不过瘾,我的QQ:28246466 别炸我,嘻嘻嘻
对了,别忘了,软件开发的美德之一---〉简单是美
通一 2002-01-15
  • 打赏
  • 举报
回复
哪裡有關於Socket Api編程的資料


我也要
florist2000 2002-01-15
  • 打赏
  • 举报
回复
这个是阻塞模式的代码
他说的是非阻塞模式的代码.
hsubo 2002-01-15
  • 打赏
  • 举报
回复
to redpower:
你的意思就是: SendBuf(Buffer,Count)的返回值只可能有两个值,一个是Count,一个就是-1,
对吧?
你看一下这个程序:
int __fastcall TC5678Socket::SendPackage ( BYTE * msg, int Size )
{
int sendcount=0,curcount;
DWORD timer = GetTickCount ();
while (sendcount < Size )
{
curcount = CSocket->Socket->SendBuf ( msg + sendcount, Size - sendcount );
if ( curcount <= 0 )
curcount = 0;
else
timer = GetTickCount ();
if ( ( GetTickCount() - timer ) > 10000 )
{//如果10秒钟没有发出一个字节则认为次连接断开
CSocket->Active = false;
return sendcount;
}
sendcount += curcount;
}
return sendcount;
}
这是一个网友提供给我程序。
如果像你说的,最大一次可以发2G,返回值只有count值和-1两种,那岂不是可以不用那个while循环了?
hsubo 2002-01-15
  • 打赏
  • 举报
回复
to redpower
返回值真的可以最大达到2G?(在非常理想的情况下)
hsubo 2002-01-15
  • 打赏
  • 举报
回复
tcp的窗口大小怎么不是64k?
在tcp头,窗口不是用2字节表示的吗? 2字节不就可以表示到64k?
常宁 2002-01-15
  • 打赏
  • 举报
回复
to hsubo(bobo)
1、SendBuf方法一次发送的数据最大是不是64k?也就是tcp的最大窗口值?
答:SendBuf一次发送最大为2G,不是64k
2、ret=SendBuf(Buffer,Count)中的返回值ret最大是不是64k?
答:不是最大2G,这就是效率很高的原因,它并不是简单封装了WinSocket,它的异步缓冲机制是一流的。
3、返回值ret的含义就是tcp的最大窗口值,能不能这样讲?
答:不是,它是发送的字节数,再异步模式下,成功发送是SendBuf(buffer,count)发送中制定的count的值,失败发送是-1,我没有见到过在这之间的返回值。

常宁 2002-01-15
  • 打赏
  • 举报
回复
to:florist2000(善良的石头)
看了你的文章觉得同你的争论可以告一段落了,不是面对面,我没有兴趣辩论了。
如果仍打算交流,用QQ吧

florist2000 2002-01-15
  • 打赏
  • 举报
回复
内部缓冲区的大小一般是80k左右(所有的mbuf加簇的总和)
你发64k数据可能会内部缓冲区容纳不下,所以在非阻塞的套节字情况下
将返回-1数据不拷贝到内部缓冲区
如果比较小,内部缓冲区能拷贝下,那么就吧这些数据都拷贝到里面了,返回发送的数目.

在阻塞的情况下不一样
返回的是发送了的数据,但是很多情况下只发送一部分数据
这就是所谓的成功一般的情况
所以你使用阻塞套节字的时候,需要做一个循环,知道所有的都发送出去
这时候最好和多线程配合,阻塞套节字的性能应该比非阻塞的好,在很多情况下.
但是非阻塞的套节字编程简单.

本人对BCB网络控件不很了解,误导阁下,请勿怪罪.
florist2000 2002-01-15
  • 打赏
  • 举报
回复
对于阻塞的套节字,返回的值就是实际发送的数据(不一定和你要发送的一样多)
对于非阻塞的套节字,返回的是传递到内部缓冲区的数据数(不一定和你发送的一样多)
阻塞的套节字不会立即返回,而非阻塞的会立即返回.

tcp的窗口最大值不是64k,
虽然一个ip包有16位的长度标志,但是那是理想情况
实际上一个Ip包一般限制在1024字节或者更少之内,
所以,你传递非常大的数据,它其实需要分片发送的.
hsubo 2002-01-15
  • 打赏
  • 举报
回复
返回值ret的含义就是tcp的最大窗口值,能不能这样讲?
加载更多回复(17)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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