关于CSocket网络编程?

需要写一个文件收发的程序,使用了CSocket。刚开始直接在主线程中实现的,
重载了OnSend ,OnReceive ,OnConnect 然后发现一切正常。OnSend ,OnReceive 
正常触发,OnConnect不能触发,看MSDN说CSocket是阻塞的OnConnect无法触发,于是去掉,然后程序正常收发文件。
  
  听说CSocket是阻塞的,不想阻塞主线程,因此另外起了一个线程。在里面进行
文件收发。(注意没有,跨线程CSocket派生的类对象只在子线程),发现OnSend,
OnReceive也无法触发了。于是直接Receive能收到数据,正常收发文件。

  现在有几个疑问,
  1. 为什么在主线程和子线程OnSend,OnReceive 的反应不一样呢。
  2. CSocket究竟是不是阻塞的,如果是为什么还有OnSend,OnReceive
  3. 所谓阻塞是指Conncect时,知道Connect成功才返回,或者错误才返回么?
  4. 用send发送一个40多M的文件时,大概4-5 ms 就完成了,但接收端并没有
  接收完成,那40多M的数据在哪里呢?不是说缓冲区只有几k到几十k的大小么?
  为什么能存放这么多的数据。难道数据都发送出去了在网络设备上面么?

作者: xiunai78   发布时间: 2011-06-16

消息一般和句柄挂钩
是否阻塞可以设置,阻塞是指动作完成了才返回

作者: ouyh12345   发布时间: 2011-06-16

引用楼主 xiunai78 的回复:
需要写一个文件收发的程序,使用了CSocket。刚开始直接在主线程中实现的,
重载了OnSend ,OnReceive ,OnConnect 然后发现一切正常。OnSend ,OnReceive
正常触发,OnConnect不能触发,看MSDN说CSocket是阻塞的OnConnect无法触发,
于是去掉,然后程序正常收发文件。

听说CSocket是阻塞的,不想阻塞主线程,因……


1.这个你没说清楚。猜测是因为socket消息不能跨线程
2.CSocket是阻塞的,但可以设置成非阻塞,所以有那些函数

作者: vcf_reader   发布时间: 2011-06-16

1. 为什么在主线程和子线程OnSend,OnReceive 的反应不一样呢。
CSocket是阻塞的,OnSend和OnReceive应该没有反应

2. CSocket究竟是不是阻塞的,如果是为什么还有OnSend,OnReceive
是阻塞的,至于为啥有OnSend和OnReceive,难道你不知道CSocket是从CAsyncSocket继承下来的吗?

3. 所谓阻塞是指Conncect时,知道Connect成功才返回,或者错误才返回么?
可以这样理解

4. 用send发送一个40多M的文件时,大概4-5 ms 就完成了,但接收端并没有
  接收完成,那40多M的数据在哪里呢?不是说缓冲区只有几k到几十k的大小么?
  为什么能存放这么多的数据。难道数据都发送出去了在网络设备上面么? 
send一次只发送一部分数据,因为滑动窗口的关系,只有这部分数据全部接受完了,才继续发送下一部分数据,淡然这个过程由send封装了,你是看不到的;多以调用recv是需要使用循环模式来接收数据就是这个道理

作者: shenyi0106   发布时间: 2011-06-16

还是用winsock API去写吧,实在。。

作者: VisualEleven   发布时间: 2011-06-16

引用 4 楼 visualeleven 的回复:

还是用winsock API去写吧,实在。。
同意
CSocket封装其实只是一个简单的示例
如果完成简单的功能倒也方便
但是要真正的应用还是自己封装来的有效

作者: xianglitian   发布时间: 2011-06-16