专门为难C高手,gethostbyname函数出错问题!!!

jamesontan 2008-09-17 04:49:57
软件平台 solaris 10
部分代码:

typedef unsigned long int my_u_long_int;
unsigned short int u_short_intHttpPort;
my_u_long_int u_long_ip;
char charhostname[256],charHttpPort[6];
struct hostent *hostent_pointer=NULL;


if ((hostent_pointer = gethostbyname(charhostname)) == NULL) /* 提取域名并转协议地址 */
{
herror("CONNECT gethostbyname error :: ");
return 2; /* 返回2表示域名解析错误 */
}
PrintLog(stderr,"gethostbyname okokok !!!");
u_long_ip=*((my_u_long_int*)hostent_pointer->h_addr_list[0]);
u_short_intHttpPort=strtol(charHttpPort,NULL,10);

该程序做成并发程序没有问题,但是放在线程中运行
则总是在运行到PrintLog(stderr,"gethostbyname okokok !!!");语句之前偶尔会core
用gdb调式跟踪内容如下:
Program terminated with signal 10, Bus error.
#0 0xff229c64 in __inet_address_is_local_af () from /usr/lib/libnsl.so.1
(gdb) where
#0 0xff229c64 in __inet_address_is_local_af () from /usr/lib/libnsl.so.1
#1 0xff2286f4 in order_haddrlist_inet () from /usr/lib/libnsl.so.1
#2 0xff227de0 in _switch_gethostbyname_r () from /usr/lib/libnsl.so.1
#3 0xff226a98 in _get_hostserv_inetnetdir_byname () from /usr/lib/libnsl.so.1
#4 0xff2232e8 in gethostbyname_r () from /usr/lib/libnsl.so.1
#5 0x0001209c in MyHttpConnect ()
#6 0x00011458 in MyHTTP_thread (LocalSock=0x15) at MyHttpThreadProxy.c:12
#7 0xff1c5800 in _lwp_start () from /usr/lib/libc.so.1
#8 0xff1c5800 in _lwp_start () from /usr/lib/libc.so.1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)

请高手指点问题出在那里? 难道函数gethostbyname()有问题,或者库函数libnsl.so.1 有问题?
而且charhostname和chaHttpPort肯定非空
...全文
529 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
镇关西 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jamesontan 的回复:]
引用 5 楼 gaosong996 的回复:
u_long_ip=*((my_u_long_int*)hostent_pointer->h_addr_list[0]);
感觉问题出在上面这句,把它换成memcpy(&u_long_ip, hostent_pointer->h_addr_list[0], sizeof(u_long_ip));看看.


呵呵。自己搞定,代码没有问题……
[/Quote]
gethostbyname返回的是一个静态指针,该函数是不可重入的,在较新的内核(2.6.238)中已不建议使用,用getnameinfo函数替代。
jamesontan 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gaosong996 的回复:]
u_long_ip=*((my_u_long_int*)hostent_pointer->h_addr_list[0]);
感觉问题出在上面这句,把它换成memcpy(&u_long_ip, hostent_pointer->h_addr_list[0], sizeof(u_long_ip));看看.
[/Quote]

呵呵。自己搞定,代码没有问题。gethostbyname()是非线程安全函数,大家用的时候要小心。
gezichong 2008-09-17
  • 打赏
  • 举报
回复
说错了,,,


没看懂,并发行,多线程不行。。。。没想通。。不好意思。
gezichong 2008-09-17
  • 打赏
  • 举报
回复
mark一下::

gethostbyname(charhostname)这个charhostname从哪里来的呢??
是从getpeername()得来的吗???
gaosong996 2008-09-17
  • 打赏
  • 举报
回复
u_long_ip=*((my_u_long_int*)hostent_pointer->h_addr_list[0]);
感觉问题出在上面这句,把它换成memcpy(&u_long_ip, hostent_pointer->h_addr_list[0], sizeof(u_long_ip));看看.
帅得不敢出门 2008-09-17
  • 打赏
  • 举报
回复
多线程,比较难搞.不确定哪个可以注释掉.
jamesontan 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 GoldenHunter 的回复:]
可能是多线程的时候资源争夺的问题,看到很多地方说printf等是线程安全的,但是在跑的过程中会出现很多的冲掉的情况,即有些printf没有输出到终端
你这里是不是因为stderr的访问冲突问题呢,随便想了点说了点,恩
[/Quote]

如果是你说的stderr问题,我将printf关闭,问题任然存在,而且gdb跟踪问题任然出在同一个地方
K行天下 2008-09-17
  • 打赏
  • 举报
回复
帮顶
GoldenHunter 2008-09-17
  • 打赏
  • 举报
回复
可能是多线程的时候资源争夺的问题,看到很多地方说printf等是线程安全的,但是在跑的过程中会出现很多的冲掉的情况,即有些printf没有输出到终端
你这里是不是因为stderr的访问冲突问题呢,随便想了点说了点,恩

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧