关于socket阻塞模式下读写的问题

xblan 2004-12-28 11:54:12
按我的理解是这样的非阻塞其实也是建立在阻塞的基础之上的(不知道对不对)

我知道阻塞模式是需要新开线程使用死循环去读的,但是send是不是也有必要在子线程中去做?我试了一下,阻塞模式下,关闭掉server,cilent发消息,并不会阻塞(跟踪了一下发现其实是在检测到没有与server连接的情况下,放弃了发送),那么如果已连接的情况下如果发送了数据,是不是一定要等到server发来确认client才认为发送成功了?否则阻塞等到确认消息。

看了一个例子发现里面只为读创建了一个线程,写是在主线程内做的,我就很糊涂了。

如果send会阻塞那么那么些线程的时候,是否要这样,在线程建立一个消息循环机制,当主线程需要向server发送数据的时候则发消息通知send线程发送数据?

可否给个实例,这问题我想了很长时间。
...全文
501 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
pangdu 2005-01-03
  • 打赏
  • 举报
回复
有道理 我也懂了

我怎么就没想到发送缓冲区上面去呢 呵呵
xblan 2005-01-01
  • 打赏
  • 举报
回复
谢谢大家
在大家的帮助下
我已经完成,自己用winsocket封装了一个类,阻塞模式的,可以指定套接子缓冲了
我知道send为什么会阻塞了,套接子缓冲满了,就会阻塞
halfdream 2005-01-01
  • 打赏
  • 举报
回复
非阻塞不是建立在阻塞基础的..呵呵.至少我这样认为..

缺省的SEND函数确实是阻塞的..楼主可以写个简单程序,建立一个SOCKET连接,然后一端SEND,
另一端暂时不调用RECV,你会发现发送端线程就会停在SEND那儿.
yuanreid 2004-12-31
  • 打赏
  • 举报
回复
答楼上,会阻塞。你没有碰到过是因为操作的时间很短,如果发送比较大的数据比如文件传输,就会出现明显的阻塞。
你说的send函数阻塞的例子,我感觉有些莫名其妙,默认send函数就是一个阻塞函数,除非你使用了select、WSAAsyncSelect、WSAEventSelect、Overlapped或CompletionPort。
pangdu 2004-12-31
  • 打赏
  • 举报
回复
阻塞模式下socket API的send函数会阻塞吗?我没碰到过,也没法让程式在执行send函数时阻塞。
那个高人能给个send函数阻塞的例子,在此谢过了。
yuanreid 2004-12-31
  • 打赏
  • 举报
回复
用setsockopt,设置SOL_SOCKET属性SO_RECVBUF进行设置
xblan 2004-12-30
  • 打赏
  • 举报
回复
请问builder 有没有提供设置套节字缓冲区大小的方法?
yuanreid 2004-12-30
  • 打赏
  • 举报
回复
Socket阻塞、非阻塞主要是标志通知方式。即同步消息通知方式Socket和异步通知方式Socket,这是划分Socket模型的一种方法。在异步通知Socket中,WindowsSocket又分为5种Socket模型,其中有支持异步通知,同步Socket操作的,也有支持异步消息通知、异步Socket操作的(比如重叠IO完成端口模型)。
yy2001 2004-12-30
  • 打赏
  • 举报
回复
mark.
xblan 2004-12-30
  • 打赏
  • 举报
回复
谢谢,这两我查了无数资料,基本搞明白是怎么回事了,现在脑子里已经有了基本框架
shadowstar 2004-12-30
  • 打赏
  • 举报
回复
比如放一个BufferList,这些都是具体的操作,应该楼主自己考虑才是
shadowstar 2004-12-30
  • 打赏
  • 举报
回复
比较放一个BufferList,这些都是具体的操作,应该楼主自己考虑才是
xblan 2004-12-29
  • 打赏
  • 举报
回复
假如send阻塞,主线程该怎么做?
xblan 2004-12-29
  • 打赏
  • 举报
回复
但是这里问题就来了,假如主线程要发送数据,先发消息告诉send线程,send线程开始向server发送数据,与server连接正常,数据发送出去等待server回应,未取得回应之前一直等待(设置一个超时),但是在等待回应的同时,主线程又要发送数据,(如果用sendmessage的话send线程就没有意义了),主线程向子线程通知发送数据后不管是否有回应都作其他事情,那么连续发包的时候丢包就是非常平常的事情了。

按照您的意思建立一个全局变量和两个发送数据的缓冲区,如果前面的数据为发送未完成则将数据不停的写入第二个缓冲区?

可否给我一个例子?
我不懂电脑 2004-12-29
  • 打赏
  • 举报
回复
send会阻塞的
主线程需要向server发送数据的时候则发消息通知send线程发送数据可以用一个全局变量做标志
send线程不断读这个标志判断。

1,317

社区成员

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

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