找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4082|回复: 9

如何接收ACE_Asynch_Transmit_File传输的数据?

[复制链接]
发表于 2009-10-26 17:15:39 | 显示全部楼层 |阅读模式
我在客户端用ACE_Asynch_Transmit_File传输了一个文件,在server端如何接收此文件?
发表于 2009-10-26 17:39:22 | 显示全部楼层
socket
bind
listen
accept
recv
close
 楼主| 发表于 2009-10-26 19:50:33 | 显示全部楼层

如何接收ACE_Asynch_Transmit_File传输的数据

我想用ACE_Asynch_Write_File 将独到的数据写到文件里面,但是写的时候总是出错
 楼主| 发表于 2009-10-26 20:08:42 | 显示全部楼层

ACE_Asynch_Write_File 将独到的数据写到文件里面

test_proactor.cpp中的例子。

if (this->wf_.write (result.message_block (),
                           result.bytes_transferred (),
                           this->file_offset_) == -1)  
        {
          ACE_ERROR ((LM_ERROR,
                      "%p\n",
                      "ACE_Asynch_Write_File::write"));
          return;
        }

ace文件写入硬盘那个函数不能正常调用,就是asynch_IO里的write返回出错,一调用就返回-1,同时log信息里说handle is not a socket,可是这个handle明明存在,怎么解决?
发表于 2009-10-27 16:32:55 | 显示全部楼层
原帖由 mouse0518 于 2009-10-26 20:08 发表
test_proactor.cpp中的例子。

if (this->wf_.write (result.message_block (),
                           result.bytes_transferred (),
                           this->file_offset_) == -1)  
        {
   ...

我也遇到了同样的问题,你的vs版本是多少,我是2008
后来换了minGW就过了。

WIN32_Asynch_IO.cpp:
ACE_WIN32_Asynch_Write_File::write()->
ACE_WIN32_Asynch_Write_Stream::shared_write()->
::WSASend (reinterpret_cast<SOCKET> (result->handle ()),...)

最后调WSASend时出错,就算强行转型可是还是不认
handle类型确实不是socket,是文件,WSASend认死理了
发表于 2009-11-2 15:22:49 | 显示全部楼层
可以不用ACE_Asynch_Write_File wf_来解决这个问题么
我的是XP+VS2005+ACE5.6.6
现在我的情况不可能更换到minGW呀
发表于 2009-11-2 17:13:31 | 显示全部楼层
原帖由 rotar 于 2009-11-2 15:22 发表
可以不用ACE_Asynch_Write_File wf_来解决这个问题么
我的是XP+VS2005+ACE5.6.6
现在我的情况不可能更换到minGW呀

如果想写文件的话直接读完socket然后写就可以,ACE好像还有一些文件的connector类可以用。不过不能和Proactor配合了。

非要用ACE_Asynch_Write_File wf_的话,可以改源码,把调WSASend的代码改成调ReadFile再重新编译。两者是一样的东西。
这样有可能行,不过我没有试验过。
发表于 2009-11-2 19:23:37 | 显示全部楼层
我试着将win32_asynch_io.cpp中的第1023行开始
  WSABUF iov;
  iov.buf = result->message_block ().rd_ptr ();
  iov.len = bytes_to_write;
  initiate_result = ::WSASend (reinterpret_cast<SOCKET> (result->handle ()),
                               &iov,
                               1,
                               &bytes_written,
                               0, // flags
                               result,
                               0);
换成他下面的
  initiate_result = ::WriteFile (result->handle (),
                                 result->message_block ().rd_ptr (),
                                 bytes_to_write,
                                 &bytes_written,
                                 result);
重新编译ACE后,可以写文件,但是Sender会在ACE_TMAIN中的
        while (success > 0  && !done)
                // Dispatch events via Proactor singleton.
                success = ACE_Proactor::instance ()->handle_events ();
处报错。
而且最成问题的是写只能写第一次收到的内容。
附上源码,wishel 有空帮我看看

[ 本帖最后由 rotar 于 2009-11-2 19:26 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?用户注册

×
发表于 2009-11-2 20:57:40 | 显示全部楼层
//if (this->wf_.write (result.message_block (),
                //        result.bytes_transferred (),
                //        this->file_offset_) == -1)
                //{
                //        ACE_ERROR ((LM_ERROR,
                //                "%p\n",
                //                "ACE_Asynch_Write_File::write"));
                //        return;
                //}

                char buf[65537];
                memcpy(buf,result.message_block().rd_ptr(),result.bytes_transferred());
               
                int i=0;
                while (i<result.bytes_transferred())
                {
                        fputc(buf,fp);
                        i++;
                }
迫不得已改成这样,直接用C的文件操作来写了,试了一下,大概没问题
可是我总怕会有包的顺序写时会发生变化,导致文件大小虽然一样,内容错位(不知道会不会发生这种情况)
另外,总感觉这个方法不是正统的ACE编程思路,请各位达人指正,告诉我一个好些的方法。
发表于 2009-11-3 15:34:13 | 显示全部楼层
原帖由 rotar 于 2009-11-2 20:57 发表
可是我总怕会有包的顺序写时会发生变化,导致文件大小虽然一样,内容错位(不知道会不会发生这种情况)

如果对端写socket的顺序确定是对的,这边读的顺序是由tcp确保可靠的。
但是那个示例程序的问题在于不能保证写socket的顺序。

原因:
sender先读file,再写socket。这是异步的。
系统可以保证异步完成顺序和发起顺序相同,但是异步完成通知的顺序不确保。
而sender下一步写socket的顺序是由  这个异步读file的完成通知顺序  来决定的,所以不可靠。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 14:01 , Processed in 0.022090 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表