找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 7937|回复: 4

socket error 10093的问题

[复制链接]
发表于 2010-6-23 13:56:43 | 显示全部楼层 |阅读模式
我按照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库的代码,这是为什么?
发表于 2010-6-23 15:12:47 | 显示全部楼层
10093: Either the application has not called WSAStartup, or WSAStartup failed.
ACE_TMAIN - > 内部自动的调用了WSAStartup.
 楼主| 发表于 2010-6-23 18:46:19 | 显示全部楼层
ACE_TMAIN应该只是一个为了兼容宽字符的宏定义吧。如果说ACE调用了WSAStartup 那么是什么时候呢?我还发现如果不用 ACE_TMAIN定义main函数,如果是了ACE:init()也可以初始化socket库存。请指教,平时我们做的时候到底应该如何做,最好能把原理也说下。
谢谢
发表于 2010-6-23 20:24:40 | 显示全部楼层
ACE_TMAIN里面调用了初始化ACE:init。
单独调用ACE:init也行
发表于 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的,那就要自己做这个工作了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-6-12 08:00 , Processed in 0.029339 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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