如何接收ACE_Asynch_Transmit_File传输的数据?
我在客户端用ACE_Asynch_Transmit_File传输了一个文件,在server端如何接收此文件? socketbind
listen
accept
recv
close
如何接收ACE_Asynch_Transmit_File传输的数据
我想用ACE_Asynch_Write_File 将独到的数据写到文件里面,但是写的时候总是出错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明明存在,怎么解决? 原帖由 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认死理了 可以不用ACE_Asynch_Write_File wf_来解决这个问题么
我的是XP+VS2005+ACE5.6.6
现在我的情况不可能更换到minGW呀 原帖由 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再重新编译。两者是一样的东西。
这样有可能行,不过我没有试验过。 我试着将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 编辑 ] //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编程思路,请各位达人指正,告诉我一个好些的方法。 原帖由 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]