[求助]这段程序内存哪儿出问题了哈
错误在HttpSocket.cpp中的Socket函数中,ppe=gethostbyname( "tcp "),就是内存错误,但是我不晓得为什么错了....
bool CHttpSocket::Socket()
{
if(m_bConnected) return false;
struct protoent *ppe=NULL;
ppe=getprotobyname( "tcp ");
m_s=socket(PF_INET,SOCK_STREAM,ppe-> p_proto);
if(m_s==-1)
{
printf( "socket() failed!\n ");
return false;
}
return true;
}
gdb调试的提示是这样的:
****************************************************
CHttpSocket::Socket (this=0xbff9a660) at HttpSocket.cpp:31
31 if(m_bConnected) return false;
(gdb) n
33 struct protoent *ppe=NULL;
(gdb) n
34 ppe=getprotobyname( "tcp ");
(gdb) n
*** glibc detected *** free(): invalid next size (normal): 0x09e20cd8 ***
Program received signal SIGABRT, Aborted.
0x001327a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb) bt
#0 0x001327a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1 0x001727f5 in raise () from /lib/tls/libc.so.6
#2 0x00174199 in abort () from /lib/tls/libc.so.6
#3 0x001a64ea in __libc_message () from /lib/tls/libc.so.6
#4 0x001acc6f in _int_free () from /lib/tls/libc.so.6
#5 0x001acfea in free () from /lib/tls/libc.so.6
#6 0x0019d516 in fclose@@GLIBC_2.1 () from /lib/tls/libc.so.6
#7 0x00825305 in _nss_files_getprotobyname_r () from /lib/libnss_files.so.2
#8 0x00229332 in getprotobyname_r@@GLIBC_2.1.2 () from /lib/tls/libc.so.6
#9 0x002291f1 in getprotobyname () from /lib/tls/libc.so.6
#10 0x0804961e in CHttpSocket::Socket (this=0xbff9a660) at HttpSocket.cpp:34
#11 0x08048ed4 in Run (strUrl=0xbffcdb25 "http://hi.baidu.com ") at http.cpp:54
#12 0x08048d60 in main (args=2, argv=0xbff9b074) at http.cpp:16
代码在这儿 [url=http://bbs.nettf.net/forums/index.php?act=Attach&type=post&id=8533]http.rar[/url]
[解决办法]
pp类型错误.应该为
struct hostent
[解决办法]
ppe
[解决办法]
If no error occurs, getprotobyname returns a pointer to the protoent. Otherwise, it returns a null pointer
so,the program will be dump at m_s=socket(PF_INET,SOCK_STREAM,ppe-> p_proto);
[解决办法]
ppe=getprotobyname( "tcp ");
没有检查ppe的值
[解决办法]
这段代码是没有问题的,一定是其它的部分引起的问题,下面的程序是可以运行的。
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class CHttpSocket
{
public:
bool Socket();
CHttpSocket()
{
m_bConnected = false;
m_s = 0;
}
private:
bool m_bConnected;
int m_s;
};
bool CHttpSocket::Socket()
{
if(m_bConnected) return false;
struct protoent *ppe=NULL;
ppe=getprotobyname( "tcp ");
cout < < "ppe = " < < ppe < < endl;
m_s=socket(PF_INET,SOCK_STREAM,ppe-> p_proto);
cout < < "ms_s = " < < m_s < < endl;
if(m_s==-1)
{
printf( "socket() failed!\n ");
return false;
}
return true;
}
int main()
{
CHttpSocket hs;
hs.Socket();
return 0;
}
[解决办法]
(gdb) n
*** glibc detected *** free(): invalid next size (normal): 0x09e20cd8 ***
---------------------------------------------
估计跟内存泄露有很大关系~
建议楼主可以查看下程序是否有内存泄露~
方法~ 运行命令~
$ valgrind --tool=memcheck --leak-check=yes 程序名
可以把结果贴出来~让大家看看~
[解决办法]
有core dump吗? 有的话gdb看一下core.
感觉应该是getprotobyname的问题.
你在这里加个if, 判断一下值.
[解决办法]
楼主的程序是不是多线程的?如果是的话,就是gethostbyname的问题了,它是个不可重入函数,里面使用的是个静态指针来执行由动态分配的一块内存,来保存函数执行的结果,
函数执行先检查释放该块内存,再根据结果大小分配内存,如果多线程调用,free,和malloc就有可能被打断,从而指向一个错误的地址.
[解决办法]
楼主写的是gethostbyname~ 代码是getprotobyname~
[解决办法]
回楼上,应该不是重入的问题:
#8 0x00229332 in getprotobyname_r@@GLIBC_2.1.2 () from /lib/tls/libc.so.6
getprotobyname_r 是可重入版本。