关于SOCKET中的RECV和SEND缓冲区和LISTEN()的问题
我想知道在一个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




