我的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越界”让我相信端口出了问题,但我不知道出了什么问题。如果有人能指出错误的话,我将不胜感激。谢谢你的帮助。
答案 0 :(得分:7)
getaddrinfo("127.0.0.1", port, &hints, &servinfo)
^
那应该是char *
。我猜你传递了一个整数,并强迫该库访问一个无效的地址。
根据Blagovest Buyukliev的评论,我相信你在构造函数中做了类似的事情:this->port = (const char*) port
。
您需要使用某些内容(可能是snprintf
?)将该整数转换为char *
。只需投射就不会。
答案 1 :(得分:1)
你应该通过引用传递port
而不是值,即&port
吗? 0x1356与4950的值相同,这是您尝试使用的端口号。
编辑好的,我认为它应该是一个字符串而不是一个指向int的指针。我将保留我的答案,因为它显示端口值被错误地解释为地址。
答案 2 :(得分:0)
您正在设置指向端口的指针,但不为其分配内存。 (至少不是我在你列出的代码中看到的。)
Port应该是一个字符串(即char数组),而不是指向char的指针。而不是整数。