mouse0518 发表于 2009-10-26 17:15:39

如何接收ACE_Asynch_Transmit_File传输的数据?

我在客户端用ACE_Asynch_Transmit_File传输了一个文件,在server端如何接收此文件?

wishel 发表于 2009-10-26 17:39:22

socket
bind
listen
accept
recv
close

mouse0518 发表于 2009-10-26 19:50:33

如何接收ACE_Asynch_Transmit_File传输的数据

我想用ACE_Asynch_Write_File 将独到的数据写到文件里面,但是写的时候总是出错

mouse0518 发表于 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明明存在,怎么解决?

wishel 发表于 2009-10-27 16:32:55

原帖由 mouse0518 于 2009-10-26 20:08 发表 http://www.acejoy.com/bbs/images/common/back.gif
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认死理了

rotar 发表于 2009-11-2 15:22:49

可以不用ACE_Asynch_Write_File wf_来解决这个问题么
我的是XP+VS2005+ACE5.6.6
现在我的情况不可能更换到minGW呀

wishel 发表于 2009-11-2 17:13:31

原帖由 rotar 于 2009-11-2 15:22 发表 http://www.acejoy.com/bbs/images/common/back.gif
可以不用ACE_Asynch_Write_File wf_来解决这个问题么
我的是XP+VS2005+ACE5.6.6
现在我的情况不可能更换到minGW呀

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

非要用ACE_Asynch_Write_File wf_的话,可以改源码,把调WSASend的代码改成调ReadFile再重新编译。两者是一样的东西。
这样有可能行,不过我没有试验过。

rotar 发表于 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 编辑 ]

rotar 发表于 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;
                memcpy(buf,result.message_block().rd_ptr(),result.bytes_transferred());
               
                int i=0;
                while (i<result.bytes_transferred())
                {
                        fputc(buf,fp);
                        i++;
                }
迫不得已改成这样,直接用C的文件操作来写了,试了一下,大概没问题
可是我总怕会有包的顺序写时会发生变化,导致文件大小虽然一样,内容错位(不知道会不会发生这种情况)
另外,总感觉这个方法不是正统的ACE编程思路,请各位达人指正,告诉我一个好些的方法。

wishel 发表于 2009-11-3 15:34:13

原帖由 rotar 于 2009-11-2 20:57 发表 http://www.acejoy.com/bbs/images/common/back.gif
可是我总怕会有包的顺序写时会发生变化,导致文件大小虽然一样,内容错位(不知道会不会发生这种情况)


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

原因:
sender先读file,再写socket。这是异步的。
系统可以保证异步完成顺序和发起顺序相同,但是异步完成通知的顺序不确保。
而sender下一步写socket的顺序是由这个异步读file的完成通知顺序来决定的,所以不可靠。
页: [1]
查看完整版本: 如何接收ACE_Asynch_Transmit_File传输的数据?