CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

关于SOCKET中的RECV和SEND缓冲区和LISTEN()的问题

楼主5460()2000-12-06 16:02:00 在 VC/MFC / 基础类 提问

我想知道在一个SOCKET上是否有2个缓冲区,一个是RECV的缓冲区,另一个是SEND的缓冲区?还是只有一个缓冲区?  
  另外,如果在RECV()(或SEND())执行后,该缓冲区是如何工作的?是马上将缓冲区的数据放入内存(或全部发送到线上)后清除吗?  
  还有一个问题是LISTEN(S,8)执行后,如果有3个CLIENT同时请求,则系统只处理一个,将其他的2个放入队列,然后做后面的ACCEPT()函数;但是这时LISTEN()不是已经执行完返回了吗,系统如何再LISTEN后面的2个请求呢? 问题点数:100、回复次数:6Top

1 楼sxbyl(sxbyl)回复于 2000-12-06 16:26:00 得分 0

我来听讲!Top

2 楼hendery(hendery)回复于 2000-12-06 17:21:00 得分 100

一个SOCKET上接收和发送各有一个缓冲区,由TCP/IP相关操作系统管理这两个缓冲区,  
  应用编程者只管把数据发到缓冲区去就行了(SEND()其实就是发数据到这个缓冲区),  
  至于该缓冲区的数据怎么又发到对方的,则是操作系统TCP/IP实现的事了,WINDOWS和  
  UNIX、LINUX的实现是不一样的。  
  如果有3个CLIENT请求同时到,实际上TCP/IP底层系统已经发了3个ACCEPT消息到该监听  
  SOCKET的线程,只是这3个消息在等着线程处理罢了,当然就是调用3次ACCEPT()。如果  
  有5个CLIENT同时到,且一次ACCEPT()都没有调用,则LISTEN队列已经满了,SOCKET就  
  再也接收不到CLIENT请求了(实际上是TCP/IP底层把请求丢掉不管了)。如果执行了一  
  次ACCEPT(),则队列就空出一个位置。所以ACCEPT消息的响应函数的操作不要太复杂,  
  要很快完成,以便下一个ACCEPT消息能够很快得到处理。  
  LISTEN()只执行一次就马上退出了,就是告诉TCP/IP底层开始接收该SOCKET的CLIENT连  
  接,以后所有的CLIENT请求都能收到。  
  SOCKET只是TCP/IP底层的一个编程接口,是RECV、SEND、ACCPET、LISTEN都是告诉底层  
  去执行什么操作,并不是SOCKET直接去执行。在多进程、多线程系统中,底层和应用是  
  同时运行的,应用在ACCEPT(),底层一样能收到CLIENT请求,只是你的应用程序执行太慢,  
  反应不过来。  
  Top

3 楼vcmfc(【痛苦的虫虫】)回复于 2000-12-06 17:26:00 得分 0

我也来听讲!Top

4 楼szjfang(fang)回复于 2000-12-06 20:11:00 得分 0

to   hendery:  
  缓冲区一直在增长吗?  
  我的服务器程序使用多线程回复客户socket请求,  
  总在第四十次报10055缓冲不够,不知何因,请多多赐教!!!  
  我的问题在   http://expert.csdn.net/TopicView.asp?id=45570  
  sztj0104@sina.comTop

5 楼hendery(hendery)回复于 2000-12-08 10:54:00 得分 0

to   szjfang:  
  本人对C++BUILDER不懂,但看你在接收CLIENT连接请求循环中的代码:  
  ReplyTrd   *OpenAThread   =   new   ReplyTrd   (true,LPClient,count);  
  OpenAThread->Resume();  
  OpenAThread->Terminate();  
  有点不大懂,好象是有一个连接进来就启动一个线程,在这个线程中把CLIENT发来的数据  
  接收过来,然后马上把线程关掉。而且这个子线程过程完全受主线程控制,因为你调用了  
  OpenAThread->Terminate()。不知是不是这样。你调用OpenAThread->Terminate()是  
  什么意思,线程执行完了会自动终止啊。  
  第一、你的客户端是不是并发的,即可能同时有多个客户需要连接进来,还是你能保证  
  客户端是有顺序进来的,还要保证一个客户服务完后,另一个客户才发出连接请求。  
  如果是并发的,则你这段代码不能处理并发情况,当然错误就难免了。  
  第二、收到的客户端连接你是在哪里关闭的。  
  第三、缓冲区当然不会在增长,每个SOCKET的RECV、SEND缓冲区都是固定的,满了后就  
  不能再SEND,或者对方就不能SEND了。不过缓冲区长度是在SOCKET创建时可以设置的,  
  用SetSockOpt,最多能设置多大,和TCP/IP底层的具体实现有关。  
  第四、你这个问题绝对可以用另外一种算法模型避免。至于在你现在这种算法下错在那里,  
  不是很清楚,你的算法毕竟不是很清楚。  
          Top

6 楼meifen(meifen)回复于 2001-07-13 12:50:54 得分 0

sTop

相关问题

  • Socket缓冲区
  • 如何清除SOCKET缓冲区的数据.
  • 怎样用setsockopt重新设置SOCKET缓冲区的大小
  • ========= 砸分了!!!!!!200镑啊!!!!!!!如何清除socket接收缓冲区 ===========
  • 怎样取得socket缓冲区中数据的字节数?
  • 有没有办法知道socket发冲缓冲区为空?
  • socket如何判断接受缓冲区是否已满
  • 如何清空socket缓冲区里的数据?
  • WinSock缓冲区
  • socks缓冲区

关键词

  • tcp/ip
  • 线程
  • 执行
  • client
  • 客户
  • 算法
  • 连接
  • 数据
  • socket
  • 应用

得分解答快速导航

  • 帖主:5460
  • hendery

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo