tyr2000 发表于 2010-6-23 13:56:43

socket error 10093的问题

我按照ace程序员指南P99页上的最简单的例子照抄,发现个问题.请大家帮忙回答下.
程序片段如下:
int _tmain(int argc, _TCHAR* argv[])
{
ACE_INET_Addr srvr(80,"192.168.1.119");
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
int ret = connector.connect(peer,srvr);
std::ACE_OS::last_error();
.....................
}

这样写的话就会有10093的错误
如果把int _tmain(int argc, _TCHAR* argv[])改成int ACE_TMAIN(int,ACE_TCHAR*) 就没有10093的错误了,
也就是说这样定义的时候会自动加入初始化socket库的代码,这是为什么?

winston 发表于 2010-6-23 15:12:47

10093: Either the application has not called WSAStartup, or WSAStartup failed.
ACE_TMAIN - > 内部自动的调用了WSAStartup.

tyr2000 发表于 2010-6-23 18:46:19

ACE_TMAIN应该只是一个为了兼容宽字符的宏定义吧。如果说ACE调用了WSAStartup 那么是什么时候呢?我还发现如果不用 ACE_TMAIN定义main函数,如果是了ACE:init()也可以初始化socket库存。请指教,平时我们做的时候到底应该如何做,最好能把原理也说下。
谢谢

winston 发表于 2010-6-23 20:24:40

ACE_TMAIN里面调用了初始化ACE:init。
单独调用ACE:init也行

earthdog 发表于 2010-7-13 22:14:19

在windows下使用socket需要调用WSAStartup,而ACE::init中为我们做了这个工作,要能正确使用,我们可以自己调用ACE::init,也可以使用ACE_TMAIN(它为我们做了ACE::init的工作和ACE::fini的工作,前一个函数是ACE做初始化工作,包括WSAStartup,初始化全局对象管理器等,后一个是在程序退出时做回收工作,回收全局对象管理器,调用WSACleanup),所以如果你的程序是Console的话,建议直接使用ACE_TMAIN,但是如果是GUI的,那就要自己做这个工作了。
页: [1]
查看完整版本: socket error 10093的问题