【发布时间】:2011-07-19 21:17:01
【问题描述】:
我的 getaddrinfo 调用出现分段错误,无法弄清楚原因。它发生在我的服务器和客户端上。一些代码(服务器端)是 -
class TcpServer {
public:
TcpServer(int);
~TcpServer();
void launchServer();
void communicate();
private:
const char* port;
int fd;
int comm_fd;
};
在 tcpserver.cpp-
void TcpServer::launchServer() {
int status;
struct addrinfo hints;
struct addrinfo *servinfo; //will point to the results
//store the connecting address and size
struct sockaddr_storage their_addr;
socklen_t their_addr_size;
//socket infoS
memset(&hints, 0, sizeof hints); //make sure the struct is empty
hints.ai_family = AF_INET; //local address
hints.ai_socktype = SOCK_STREAM; //tcp
hints.ai_flags = AI_PASSIVE; //use local-host address
//get server info, put into servinfo
if ((status = getaddrinfo("127.0.0.1", port, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
主要-
TcpServer server(4950);
server.launchServer();
传递给构造函数的int 被强制转换为用于端口的const char*。
当我运行 gdb 时,它给了我一个回溯 -
#0 0xb7dca737 in getaddrinfo (name=0x8054824 "127.0.0.1",
service=0x1356 <Address 0x1356 out of bounds>, hints=0xbffff20c,
pai=0xbffff234) at ../sysdeps/posix/getaddrinfo.c:2080
#1 0x08050f79 in TcpServer::launchServer (this=0xbffff304) at tcpserver.cpp:25
#2 0x0804eae9 in main (argc=1, args=0xbffff3f4) at mainserver.cpp:47
所以“地址 0x1356 越界”让我相信端口有问题,但我不知道可能出了什么问题。如果有人能指出错误,我将不胜感激。感谢您的帮助。
【问题讨论】:
-
在同一个源文件中混合两种语言很难。我建议您在项目中坚持使用 C 或 C++ 之一。
-
您对 getaddrinfo 的
port参数是错误的。你如何初始化你的 TcpServer 类的port成员? -
@pmg 他使用 C 是因为他从手册页复制了必要的代码。
-
@nos:他实际上提到了如何(你是对的,他做错了)。我已将那部分加粗,以便更清楚错误是什么。
-
@Sterling:正确的代码应该很少有演员表。尽可能避免强制转换,这是您的问题的确切原因。不幸的是,这是许多人在学习指针时似乎养成的习惯:-/.
标签: c++ c sockets segmentation-fault bsd